Как-нибудь сделать `где booleanvalue=false` на Sql Server и PostgreSQL?
Я пытаюсь сделать приложение способным работать как на Sql Server, так и на PostgreSQL.
Я не могу найти общее выражение, которое в основном
select * from table where booleancol=false
на SQL Server я должен это сделать (что очень сбивает с толку, поскольку значение по умолчанию для битовых типов должно быть истинным или ложным, но вы не можете присвоить им истинное или ложное значение или проверить его)
select * from table where booleancol=0
на PostgreSQL я должен сделать
select * from table where booleancol is false
В нашей программе есть довольно много запросов, которые делают это, поэтому я бы предпочел, чтобы был какой-то универсальный синтаксис, который я мог бы использовать вместо того, чтобы делать if(dbformat=="postgres")..
типа дерьмо..
Кроме того, я бы предпочел оставить столбцы как логические / битовые типы и не менять их на целочисленные типы... хотя это вариант..
5 ответов
SQL Server автоматически изменит значение бита на значение varchar, равное true или false. Так что там работает следующее:
select * from table where booleancol = 'false'
Я понятия не имею, делает ли Postgre то же самое.
Извините, эта часть просто не соответствует действительности; менее чем наполовину правда;-)
на PostgreSQL я должен сделать
select * from table where booleancol is false
Фактически, все следующие синтаксисы действительны в PostgreSQL:
select * from table where not booleancol
select * from table where booleancol = 'f'
select * from table where booleancol = 'false'
select * from table where booleancol = 'n'
select * from table where booleancol is false
select * from table where booleancol is not true
select * from table where booleancol = false
select * from table where booleancol <> true
select * from table where booleancol != true
select * from table where booleancol <> 'TRUE'
Это пример гибкого синтаксиса postgres, который делает перенос приложений из других баз данных довольно простым.
Смотрите документы.
На работе мы используем 'T' и 'F' в столбцах char(1) для представления логических значений в SQL Server. Я не уверен, была ли причина такого рода совместимости, но это означает, что "booleancol = 'F'" будет работать с любой разновидностью базы данных.
Если это вариант, взгляните на инфраструктуру реляционного сопоставления объектов, которая может решить проблему перевода SQL из одной RDBMS в другую.
Используйте ORM, сегодня нет необходимости передавать код SQL. Они существуют, поэтому решите саму проблему, с которой вы столкнулись.