Ist dies der richtige Weg, um einen booleschen Test in SQL durchzuführen?

81

Angenommen, aktiv ist ein "boolesches Feld" (winziges int, mit 0 oder 1)

# Find all active users
select * from users where active 

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

Mit anderen Worten, kann der Operator "NOT" direkt auf das boolesche Feld angewendet werden?

Eric
quelle
Ja, wie bereits erwähnt, werden boolesche Felder normalerweise mit 'bit' und nicht mit 'int' eingegeben
Davis,
Ich gehe davon aus, dass Sie wirklich nach gut aussehendem Code suchen, da Sie zweifellos wissen würden, dass "active = 0" eine mögliche Problemumgehung ist. Bei der Wahl zwischen "NICHT aktiv" und "aktiv = 0" würde ich mich nicht darum kümmern - wenn Sie es unbedingt erklären müssen, fügen Sie einen Kommentar hinzu. (Falls jemand, der in Zukunft mit dem Code arbeitet, die Beziehung zwischen wahr und falsch <-> 1/0 nicht versteht, sollte jemand Ihren Code nicht berühren, übrigens ...)
Tomas Aschan,
1
@Eric: In SQL muss ein Prädikat ein boolesches Ergebnis erzeugen. Ein "wo aktiv" erzeugt kein solches Ergebnis, denn selbst wenn 'aktiv' ein BIT-Datentyp war - ein BIT ist kein Boolescher Wert, es ist ein ganzzahliger Wert mit einem Bereich von 0..1. Sie müssen also einen Vergleich durchführen, um einen Booleschen Wert zu erhalten. "wo NICHT (aktiv = 1)" würde funktionieren, aber nicht "wo NICHT aktiv".
Tomalak
Tomalak - du hättest diesen Kommentar als Antwort posten sollen!
Womp
@Tomalak: "In SQL muss ein Prädikat ein boolesches Ergebnis erzeugen" - nicht ganz. SQL weist eine Logik mit drei Werten auf, dh TRUE, FALSE und UNKNOWN (bedenken Sie, dass 'active' NULL sein kann).
Tag, wenn

Antworten:

87

Ein Boolescher Wert in SQL ist ein Bitfeld. Dies bedeutet entweder 1 oder 0. Die korrekte Syntax lautet:

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

oder

select * from users where active = 0 /* All Inactive Users */
Jose Basilio
quelle
14
@ JoseBasilio- Außer in PostgreSQL: postgresql.org/docs/9.1/static/datatype-boolean.html
Yarin
In den meisten DBs können Felder auch NULL sein. Möglicherweise müssen Sie auch nach NULL suchen, wenn Sie die Tabelle nicht mit einem Standardwert für das aktive Feld konfigurieren.
IAmNaN
Mit SQLite in Rails (4) wurden Abfragen mit 'f' oder 't' durchgeführt (allerdings nicht als Zeichen). Bei Verwendung der obigen Abfrage hat es nicht funktioniert. Obwohl: SELECT “model".* FROM “model" WHERE “boolean_column" = ‘f'gearbeitet
Stefan Hendriks
25

Mit Postgres können Sie verwenden

select * from users where active

oder

select * from users where active = 't'

Wenn Sie einen ganzzahligen Wert verwenden möchten, müssen Sie ihn als Zeichenfolge betrachten. Sie können keinen ganzzahligen Wert verwenden.

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

select * from users where active = '1' -- Works 
Luc M.
quelle
schaute ALLES um herauszufinden, ob es wahr oder WAHR oder 1 erwartete, also war Ihre Antwort sehr hilfreich
jpw
4
+1 Mehr zu den booleschen Optionen von PostgreSQL: postgresql.org/docs/9.1/static/datatype-boolean.html
Yarin
1
Außerdem akzeptiert Posgtres die Syntax von OP: where active, where not active. Siehe postgresql.org/docs/8.2/static/functions-logical.html
Loïc Faugeron
13

MS SQL 2008 kann auch die Zeichenfolgenversion true oder false verwenden ...

select * from users where active = 'true'
-- or --
select * from users where active = 'false'
Scott Ivey
quelle
Wow, das ist cool ... Ich hatte keine Ahnung, dass das funktioniert, aber definitiv ab 2008.
Maxim Gershkovich
11

In SQL Server würden Sie im Allgemeinen verwenden. Ich weiß nichts über andere Datenbank-Engines.

select * from users where active = 0
Jonathan Allen
quelle
3

Ich persönlich bevorzuge die Verwendung von char (1) mit den Werten 'Y' und 'N' für Datenbanken, die keinen nativen Typ für Boolesche Werte haben. Buchstaben sind benutzerfreundlicher als Zahlen, die davon ausgehen, dass diejenigen, die sie lesen, jetzt wissen, dass 1 wahr und 0 falsch ist.

'Y' und 'N' werden auch bei Verwendung von (N) Hibernate gut zugeordnet.

stili
quelle
0

PostgreSQL unterstützt boolesche Typen, sodass Ihre SQL-Abfrage in PostgreSQL perfekt funktioniert.

Jordi Cabot
quelle
-1

Wenn Sie SQLite3 verwenden, achten Sie auf Folgendes:

Es dauert nur 't' oder 'f'. Nicht 1 oder 0. Nicht WAHR ODER FALSCH.

Habe gerade auf die harte Tour gelernt.

alexandros84
quelle
1
Das ist nicht wahr. dev.mysql.com/doc/refman/8.0/de/numeric-type-overview.html : "Diese Typen sind Synonyme für TINYINT (1). Ein Wert von Null wird als falsch angesehen. Werte ungleich Null werden als wahr angesehen."
Moritz