Каким-то образом сделать `where booleanvalue=false` как на сервере Sql, так и на 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")...

Кроме того, я бы предпочел оставить столбцы как логические/битовые типы и не изменять их на целые типы.. хотя это вариант..


person Earlz    schedule 22.12.2009    source источник


Ответы (5)


SQL Server автоматически изменит значение бита на значение varchar, равное true или false. Итак, там работает следующее:

select * from table where booleancol = 'false'

Я понятия не имею, делает ли Postgre то же самое.

person NotMe    schedule 22.12.2009

Извините, эта часть просто не соответствует действительности; меньше полуправды ;-)

на 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, который позволяет легко переносить приложения из других баз данных.

См. документацию.

person Community    schedule 06.01.2010
comment
да, но из вашего списка только 2 синтаксиса также поддерживаются Sql Server, и я использовал то, что было допустимо только в SQL Server: select * from table where booleancol=0 - person Earlz; 06.01.2010
comment
Этот список не является исчерпывающим, но ссылка на документацию такова: Используемый вами синтаксис (0/1 для false/true) также действителен для PostgreSQL. - person Tristan Reid; 26.07.2015

На работе мы используем «T» и «F» в столбцах char(1) для представления логических значений в SQL Server. Я не уверен, была ли причиной такая совместимость, но это означает, что «booleancol = 'F'» будет работать с любой разновидностью базы данных.

person araqnid    schedule 22.12.2009

Если есть возможность, взгляните на инфраструктуру объектно-реляционного сопоставления, которая может справиться с проблемой перевода SQL из одной СУБД в другую.

person Phil Sandler    schedule 22.12.2009

Используйте ORM, сегодня нет необходимости передавать код SQL. Они существуют, поэтому решите ту самую проблему, с которой вы столкнулись.

person mP.    schedule 22.12.2009
comment
За него проголосовали, потому что он (а) полностью не отвечает на вопрос и (б) делает вид, что знает все о применении ОП. - person henrebotha; 06.05.2016