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?


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

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 

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'

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

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.


0

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.