Czy to jest właściwy sposób wykonywania testów logicznych w języku SQL?

81

Załóżmy, że aktywne to „pole logiczne” (małe int, z 0 lub 1)

# Find all active users
select * from users where active 

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

Innymi słowy, czy operator „NIE” można zastosować bezpośrednio w polu boolowskim?

Eric
źródło
Tak, jak zostało wysłane, pola logiczne są zwykle wpisywane jako „bit”, a nie „int”
Davis
Zakładam, że naprawdę szukasz ładnie wyglądającego kodu, ponieważ bez wątpienia zdawałeś sobie sprawę, że "active = 0" jest możliwym obejściem. W wyborze pomiędzy „NIEAKTYWNE” i „AKTYWNE = 0” nie zawracałbym sobie głowy - jeśli koniecznie potrzebujesz wyjaśnienia, dodaj komentarz. (W przypadku, gdy ktoś pracujący z kodem w przyszłości nie zrozumie relacji prawda / fałsz <-> 1/0, może ktoś nie powinien dotykać twojego kodu, przy okazji ...)
Tomas Aschan
1
@Eric: W SQL predykat musi generować wynik boolowski. „Gdzie aktywny” nie daje takiego wyniku, ponieważ nawet jeśli „aktywny” był typem danych BIT - BIT nie jest wartością logiczną, to jest liczbą całkowitą z zakresem 0..1. Więc trzeba zrobić porównanie jakiegoś wytworzenia logiczne. „Gdzie NIE (aktywne = 1)” zadziała, ale nie „gdzie NIE jest aktywne”.
Tomalak
Tomalak - powinieneś był zamieścić ten komentarz jako odpowiedź!
womp
@Tomalak: „W SQL predykat musi dawać wynik boolowski” - nie do końca. SQL wykazuje logikę trzech wartości, tj. TRUE, FALSE i UNKNOWN (należy wziąć pod uwagę, że „aktywny” może mieć wartość NULL).
jednego

Odpowiedzi:

88

Wartość logiczna w SQL to pole bitowe. Oznacza to 1 lub 0. Prawidłowa składnia to:

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

lub

select * from users where active = 0 /* All Inactive Users */
Jose Basilio
źródło
14
@ JoseBasilio- Z wyjątkiem PostgreSQL: postgresql.org/docs/9.1/static/datatype-boolean.html
Yarin
W większości baz danych pola mogą mieć również wartość NULL. Może być konieczne sprawdzenie wartości NULL, jeśli nie skonfigurujesz tabeli z wartością domyślną dla aktywnego pola.
IAmNaN
używając SQLite w Rails (4) tworzył zapytania używając 'f' lub 't' (chociaż nie jako znaków). Podczas korzystania z powyższego zapytania nie zadziałało. Chociaż: SELECT “model".* FROM “model" WHERE “boolean_column" = ‘f'pracował
Stefan Hendriks
25

Z Postgresem możesz używać

select * from users where active

lub

select * from users where active = 't'

Jeśli chcesz użyć wartości całkowitej, musisz traktować ją jako ciąg. Nie możesz użyć wartości całkowitej.

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

select * from users where active = '1' -- Works 
Luc M
źródło
przejrzeliśmy WSZYSTKO, aby dowiedzieć się, czy oczekiwał prawdy, PRAWDA lub 1, więc Twoja odpowiedź była bardzo pomocna
jpw
4
+1 Więcej na temat opcji logicznych PostgreSQL: postgresql.org/docs/9.1/static/datatype-boolean.html
Yarin
1
Ponadto Posgtres akceptuje składnię OP: where active, where not active. Zobacz postgresql.org/docs/8.2/static/functions-logical.html
Loïc Faugeron
13

MS SQL 2008 może również używać ciągowej wersji true lub false ...

select * from users where active = 'true'
-- or --
select * from users where active = 'false'
Scott Ivey
źródło
Wow, to super ... Nie miałem pojęcia, że ​​to działa, ale zdecydowanie działa w 2008+ z moich testów.
Maxim Gershkovich
12

W SQL Server zazwyczaj używasz. Nie wiem o innych silnikach baz danych.

select * from users where active = 0
Jonathan Allen
źródło
3

Osobiście wolę używać char (1) z wartościami „Y” i „N” dla baz danych, które nie mają natywnego typu dla wartości logicznych. Litery są bardziej przyjazne dla użytkownika niż liczby, które zakładają, że czytający będą teraz, że 1 odpowiada prawdzie, a 0 odpowiada fałszowi.

`` Y '' i `` N '' również ładnie odwzorowują, gdy używasz (N) Hibernacji.

stili
źródło
0

PostgreSQL obsługuje typy logiczne, więc zapytanie SQL działałoby doskonale w PostgreSQL.

Jordi Cabot
źródło
-1

Jeśli używasz SQLite3, uważaj:

Wystarczy tylko „t” lub „f”. Nie 1 lub 0. NIE PRAWDA LUB FAŁSZ.

Właśnie się nauczyłem.

alexandros84
źródło
1
To nie jest prawda. dev.mysql.com/doc/refman/8.0/en/numeric-type-overview.html : "Te typy są synonimami TINYINT (1). Wartość zero jest uważana za fałsz. Wartości niezerowe są uważane za prawdziwe".
Moritz,