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?


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 */

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 

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'

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

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.


0

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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.