Сравнение разных типов данных в PostgreSQL. - PullRequest
1 голос
/ 07 декабря 2011

Прошло много времени с тех пор, как я написал одну из своих публикаций "Преобразование MySQL в PostgreSQL".

Итак, сегодняшняя проблема заключается в следующем:

Исходные запросы MySQL включают предложения where, которые выглядят примерно так:

 WHERE id LIKE '%6%' 
 OR createdtime LIKE '%6%' 
 OR modifiedtime LIKE '%6%' 
 OR start_date LIKE '%6%' 
 OR end_date LIKE '%6%' 
 OR sc_related_to LIKE '%6%' 
 OR tracking_unit LIKE '%6%'
 OR message LIKE '%6%'

Этот запрос является частью общесистемного поиска. В этом случае система ищет 6, если бы я попросил ее найти что-то еще, например, сказать слово user, вместо %6%, мы получили бы %user%.

Теперь проблема в том, что указанные выше типы данных не всегда являются строками. Целочисленные поля, такие как id и поля даты / времени, такие как createdtime, сравниваются со строками. В MySQL это вроде бы нормально, но раздражительный PostgreSQL становится раздражительным, когда видит этот запрос.

Я знаю, что для некоторых полей я могу использовать функцию to_char, поэтому, например, часть предложения в PostgreSQL может выглядеть так:

 to_char(id, '999') LIKE '%6%' 

К сожалению, я не могу просто пройтись по запросам и добавить to_char в каждое применимое поле из-за PHP-бэкэнда. Вот как выглядит PHP-код для генерации предложения WHERE:

 $where .= $tablename.".".$columnname." LIKE '". formatForSqlLike($search_val) ."'";

Примечание: это часть цикла, поэтому приведенная выше строка генерирует все отдельные сравнения.

Итак, даже если я смогу обойти сравнение типов с to_char, я не смогу реализовать его, потому что to_char может потребоваться определенный 2-й параметр для другого типа данных и даже если бы я мог использовать тот же параметр для всех типов данных некоторые из типов данных будут строками, и передача строки в to_char приводит к ошибке.

Итак, мне нужен способ заставить PHP определить тип столбца и использовать правильное значение to_char (или вообще не использовать его) соответственно, или мне нужно получить PostgreSQL для сравнения разных типов данных.

Спасибо за вашу помощь, хорошего дня!

1 Ответ

4 голосов
/ 07 декабря 2011

Вы можете просто привести все к строке, например:

$where .= $tablename.".".$columnname."::text LIKE '". formatForSqlLike($search_val) ."'";

Если вы не хотите изменять код PHP, другая идея заключается в создании VIEW, который выполняет приведение, например:

CREATE OR REPLACE VIEW TableName AS
   SELECT
     createdtime::text,
     modifiedtime::text,
     start_date::text,
     end_date::text,
     sc_related_to::text,
     tracking_unit::text,
     message::text
   FROM RealTable;

Тогда ваш PHP-код будет использовать это представление вместо таблицы и видеть все как текст.

Тем не менее, я считаю, что ваша техника здесь действительно не будет хорошо масштабироваться. Каждый поиск, вероятно, будет выполнять последовательное сканирование всей таблицы, поскольку предложения LIKE не могут быть проиндексированы.

Лучше всего изменить его, используя FULLTEXT поисковый индекс , который будет более универсальным и молниеносным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...