Це правильний спосіб зробити логічний тест у SQL?


81

Припустимо, що активним є "логічне поле" (крихітний int, з 0 або 1)

# Find all active users
select * from users where active 

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

На словах, чи можна застосувати оператор "НЕ" безпосередньо до логічного поля?


Так, як було опубліковано, логічні поля зазвичай набираються "біт", а не "int"
Девіс

Я припускаю, що ви справді шукаєте приємний на вигляд код, оскільки, без сумніву, ви знаєте, що "активна = 0" - це можливе обхідне рішення. Вибираючи "НЕ активний" та "активний = 0", я б не заважав - якщо вам обов'язково потрібно це пояснити, додайте коментар. (Якщо хтось, хто працює з кодом у майбутньому, не зрозуміє відношення true / false <-> 1/0, можливо, хтось не повинен торкатися вашого коду, до речі ...)
Томас Ашан

1
@Eric: У SQL предикат повинен створити логічний результат. "Де активний" не дає такого результату, оскільки навіть якщо "активний" був типом даних BIT - BIT не є булевим значенням, це ціле число з діапазоном 0..1. Отже, ви повинні зробити порівняння, щоб отримати логічне значення. "де НЕ (активний = 1)" буде працювати, але не "де НЕ активний".
Томалак

Томалак - вам слід було розмістити цей коментар як відповідь!
womp

@Tomalak: "У SQL предикат повинен давати булевий результат" - не зовсім. SQL демонструє три значення логіки, тобто TRUE, FALSE і UNKNOWN (враховуйте, що "активним" може бути NULL).
onedaywhen

Відповіді:


88

Логічне значення в SQL - це бітове поле. Це означає або 1, або 0. Правильний синтаксис:

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

або

select * from users where active = 0 /* All Inactive Users */

14
@ JoseBasilio- За винятком PostgreSQL: postgresql.org/docs/9.1/static/datatype-boolean.html
Ярін,

У більшості БД поля також можуть мати значення NULL. Можливо, вам доведеться перевірити наявність NULL, якщо ви не налаштуєте таблицю зі значенням за замовчуванням для активного поля.
IAmNaN

використовуючи SQLite в Rails (4), він робив запити, використовуючи 'f' або 't' (хоча не як символи). При використанні наведеного вище запиту це не спрацювало. Хоча: SELECT “model".* FROM “model" WHERE “boolean_column" = ‘f'працював
Стефан Хендрікс

25

З 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 

переглянув ВСЕ, щоб з’ясувати, чи очікував він правди, ІСТИНИ чи 1, тож ваша відповідь була дуже корисною
jpw

4
+1 Більше про логічні параметри PostgreSQL: postgresql.org/docs/9.1/static/datatype-boolean.html
Ярін,

1
Також, Posgtres приймає синтаксис OP: where active, where not active. Див postgresql.org/docs/8.2/static/functions-logical.html
Лоїк Faugeron

13

MS SQL 2008 також може використовувати рядкову версію true або false ...

select * from users where active = 'true'
-- or --
select * from users where active = 'false'

Ого, це круто ... Я не мав уявлення, що це працює, але, безумовно, працює в 2008+ після мого тестування.
Максим Гершкович

12

У SQL Server ви зазвичай використовуєте. Я не знаю про інші механізми баз даних.

select * from users where active = 0

3

Я особисто вважаю за краще використовувати char (1) зі значеннями 'Y' і 'N' для баз даних, які не мають власного типу для логічного значення. Букви є більш зручними для користувачів, ніж цифри, які припускають, що ті, хто їх читає, тепер будуть відповідати 1, що відповідає true, а 0 відповідає false.

"Y" і "N" також добре відображаються при використанні (N) Hibernate.


0

PostgreSQL підтримує логічні типи, тому ваш SQL-запит буде чудово працювати в PostgreSQL.


-1

Якщо ви використовуєте SQLite3, будьте обережні:

Потрібно лише 't' або 'f'. Ні 1, ні 0. Не ІСТИННО АБО ХИБНО.

Щойно навчився важким шляхом.


1
Це не правда. dev.mysql.com/doc/refman/8.0/en/numeric-type-overview.html : "Ці типи є синонімами TINYINT (1). Значення нуля вважається хибним. Ненульові значення вважаються істинними".
Моріц,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.