Это правильный способ сделать логический тест в SQL? - PullRequest
63 голосов
/ 13 мая 2009

Предположим, что active - это "логическое поле" (крошечное int, с 0 или 1)

# Find all active users
select * from users where active 

# Find all inactive users
select * from users where NOT active 

Словом, может ли оператор «НЕ» применяться непосредственно к логическому полю?

Ответы [ 7 ]

71 голосов
/ 13 мая 2009

Логическое значение в SQL - это битовое поле. Это означает 1 или 0. Правильный синтаксис:

select * from users where active = 1 /* All Active Users */

или

select * from users where active = 0 /* All Inactive Users */
18 голосов
/ 13 мая 2009

С Postgres вы можете использовать

select * from users where active

или

select * from users where active = 't'

Если вы хотите использовать целочисленное значение, вы должны рассматривать его как строку. Вы не можете использовать целочисленное значение.

select * from users where active = 1   -- Does not work

select * from users where active = '1' -- Works 
11 голосов
/ 13 мая 2009

MS SQL 2008 также может использовать строковую версию true или false ...

select * from users where active = 'true'
-- or --
select * from users where active = 'false'
9 голосов
/ 13 мая 2009

В SQL Server вы обычно используете. Я не знаю о других движках базы данных.

select * from users where active = 0
3 голосов
/ 13 мая 2009

Я лично предпочитаю использовать char (1) со значениями 'Y' и 'N' для баз данных, которые не имеют собственного типа для логического типа. Буквы более удобны для пользователя, чем числа, которые предполагают, что те, кто читает его, теперь будут считать, что 1 соответствует истине, а 0 соответствует ложной.

'Y' и 'N' также хорошо отображаются при использовании (N) Hibernate.

0 голосов
/ 01 марта 2017

Если вы используете SQLite3, будьте осторожны:

Требуется только 't' или 'f'. Не 1 или 0. Не ИСТИННО И НЕ ЛОЖНО.

Просто выучил трудный путь.

0 голосов
/ 14 мая 2009

PostgreSQL поддерживает логические типы, поэтому ваш запрос SQL будет отлично работать в PostgreSQL.

...