Как-нибудь сделать `где 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. Они существуют, поэтому решите саму проблему, с которой вы столкнулись.

Другие вопросы по тегам