Как-нибудь сделать `где booleanvalue = false` на Sql Server и PostgreSQL? - PullRequest
17 голосов
/ 22 декабря 2009

Я пытаюсь создать приложение, способное работать как на 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 ]

30 голосов
/ 06 января 2010

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

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

См. Документы .

17 голосов
/ 22 декабря 2009

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

select * from table where booleancol = 'false'

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

1 голос
/ 22 декабря 2009

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

0 голосов
/ 22 декабря 2009

Если это вариант, взгляните на инфраструктуру реляционного сопоставления объектов, которая может решить проблему перевода SQL из одной RDBMS в другую.

0 голосов
/ 22 декабря 2009

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

...