PGError: ОШИБКА: оператор не существует: логическое значение ~~ * unknown - PullRequest
4 голосов
/ 20 января 2011

Локально я разрабатываю с SQLite, но на своем производственном хосте я использую PostgreSQL. Локально все хорошо, но не так на производственном хосте.

Я создал поисковую форму, с помощью которой я могу оценивать все данные в моей базе данных с любой комбинацией, которая мне нравится. Кажется, это работает нормально, если я не использую логические поля и / или поля даты. Мне кажется, PostgreSQL не очень нравится мой код…

Итак, вот пример кода:

unless params[:analysis][:sporty].blank?
  tmp_conditions_customer << ["(sporty ILIKE ?)", "%#{params[:analysis][:sporty]}%"]
end

Это оценивается как

SELECT COUNT(*) FROM "customers" WHERE ((sporty ILIKE '%%') 

Почему это так или иначе? Почему '%%'?

Для тестирования развертывания я использую Heroku с плагином Exceptional. Этот плагин дает мне следующую подсказку:

HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.

Спасибо Исключительно, но что, черт возьми, это значит? :-D Тип приведений для запросов SQL? Как это сработает?

В моей миграции поле базы данных выглядит так:

t.boolean :sporty

И в форме, где я создаю эти данные, я использую этот код

<%= f.label :sporty %><br />
<%= f.select :sporty, options_for_select({ "Ja"  => true, "Nein" => false }), { :include_blank => '-----'}  %>

Как я уже упоминал, SQLite - мой друг, и, похоже, гораздо более строгая оценка PostgreSQL вызывает проблемы.

Заранее спасибо за помощь.

1 Ответ

5 голосов
/ 20 января 2011

Прямой ответ находится внизу. , .

Это оценивается как

SELECT COUNT(*) FROM "customers" WHERE ((sporty ILIKE '%%') 

Почему это так или иначе? Почему '%%'?

В SQL символ «%» является подстановочным знаком. Но, похоже, ваша проблема заключается в том, что вы создаете предложение WHERE, в котором есть две открывающие части, но только одна закрывающая.

Предложение WHERE, подобное этому, вероятно, вернет (или посчитает) все строки:

WHERE (sport ILIKE '%%')

Тип приведений для запросов SQL? Как это будешь работать?

Стандартный SQL имеет функцию CAST (). Синтаксис скелета

CAST (expression AS type)

Так, например, вы можете написать

CAST (<any timestamp> AS DATE) 

для изменения метки времени на тип данных даты или

CAST ('32' AS INTEGER)

чтобы заменить строку '32' на целое число 32.

В моей миграции поле базы данных выглядит так:

t.boolean :sporty

Если в столбце "sporty" указан логический тип, это ваша настоящая проблема. Если вы попытаетесь использовать сравнение строк с логическим значением (которое вы сделали: WHERE ((sporty ILIKE '%%')), вы получите сообщение об ошибке, которое вы видели. Вы хотите, чтобы оператор читал больше так:

SELECT COUNT(*) FROM "customers" WHERE sporty;
SELECT COUNT(*) FROM "customers" WHERE sporty = true;

или

SELECT COUNT(*) FROM "customers" WHERE NOT sporty;
SELECT COUNT(*) FROM "customers" WHERE sporty = false;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...