Wie schreibe ich einen literalen booleschen Wert in SQL Server? Siehe Beispielverwendung:
select * from SomeTable where PSEUDO_TRUE
ein weiteres Beispiel:
if PSEUDO_TRUE
begin
select 'Hello, SQL!'
end
Hinweis: Die obige Abfrage hat nichts damit zu tun, wie ich sie verwenden werde. Es ist nur, um den wörtlichen Booleschen Wert zu testen.
IS TRUE
,IS UNKNOWN
usw. (obwohl der SQL-99 - Standard hat beides). Eine übliche Problemumgehung besteht darin, eine eingeschränkteCHAR(1)
Spalte zu verwendenCHECK (col1 IN ('T', 'F'))
.Antworten:
SQL Server hat keinen booleschen Datentyp . Wie @Mikael angegeben hat, ist die engste Annäherung das Bit. Aber das ist ein numerischer Typ, kein boolescher Typ. Außerdem werden nur 2 Werte unterstützt -
0
oder1
(und ein NichtwertNULL
).SQL (Standard-SQL sowie T-SQL-Dialekt) beschreibt eine dreiwertige Logik . Der booleschen Typ für SQL sollte 3 Werte unterstützen -
TRUE
,FALSE
undUNKNOWN
(und auch den nicht-WertNULL
). Alsobit
passt das hier eigentlich nicht gut zusammen.Da SQL Server den Datentyp nicht unterstützt , sollten wir nicht erwarten können, Literale dieses "Typs" schreiben zu können.
quelle
True
undFalse
als syntaktischer Zucker in den SQL - Skripte zumindest.true
oderfalse
, sondern wahrheitsgemäße (nicht 0) und falsche (0) Werte. C99 fügte stdbool.h hinzu, das nur die Makros für diese definiert, aber bei der Nachbearbeitung werden solche Werte durch 1 bzw. 0 ersetzt.select * from SomeTable where 1=1
quelle
1=1
ist boolesch wahr, aber es ist kein Literal.Die meisten Datenbanken akzeptieren dies:
select * from SomeTable where true
Einige Datenbanken (z. B. SQL Server, Oracle) haben jedoch keinen booleschen Typ. In diesen Fällen können Sie verwenden:
select * from SomeTable where 1=1
Übrigens, wenn Sie eine SQL where-Klausel von Hand erstellen, ist dies die Grundlage für die Vereinfachung Ihres Codes, da Sie nicht wissen müssen, ob die Bedingung, die Sie einer where-Klausel hinzufügen möchten, die erste ist (der vorangestellt werden sollte)
"WHERE"
) oder eine nachfolgende (der vorangestellt werden sollte"AND"
). Beginnen Sie immer mit"WHERE 1=1"
allen Bedingungen (falls vorhanden), die der where-Klausel hinzugefügt wurden"AND"
.quelle
An expression of non-boolean type specified in a context where a condition is expected, near 'group'
Ich benutze MSSQLSQL
nicht angegeben habeMSSQL
.Dies wird in keiner der anderen Antworten erwähnt. Wenn Sie einen Wert wünschen, der als Boolescher Wert hydratisiert (sollte), können Sie ihn verwenden
CONVERT (Bit, 0) - false CONVERT (Bit, 1) - true
Dies gibt Ihnen ein bisschen, das kein Boolescher Wert ist. Sie können diesen Wert nicht in einer if-Anweisung verwenden, zum Beispiel:
IF CONVERT(bit, 0) BEGIN print 'Yay' END
woudl nicht analysieren. Sie müssten noch schreiben
Es ist also nicht besonders nützlich.
quelle
Laut Microsoft : Syntax für die Suche ist
Und die Suchbedingung ist:
Und Prädikat ist:
Wie Sie sehen, müssen Sie zum Vergleichen immer zwei Ausdrücke schreiben. Hier ist die Suchbedingung ein boolescher Ausdruck wie 1 = 1, a! = B.
Verwechseln Sie Suchausdrücke nicht mit booleschen Konstanten wie 'True' oder 'False' . Sie können BIT-Variablen boolesche Konstanten zuweisen
DECLARE @B BIT SET @B='True'
In TSQL können Sie jedoch keine booleschen Konstanten anstelle von booleschen Ausdrücken wie diesen verwenden:
SELECT * FROM Somewhere WHERE 'True'
Es wird nicht funktionieren.
Sie können jedoch boolesche Konstanten verwenden, um einen zweiseitigen Suchausdruck wie folgt zu erstellen:
quelle
SQL Server hat keine wörtlichen wahren oder falschen Werte. Sie müssen die verwenden
1=1
In den seltenen Fällen, in denen dies erforderlich ist, Methode (oder eine ähnliche Methode) verwenden.Eine Möglichkeit besteht darin, eigene benannte Variablen für true und false zu erstellen
DECLARE @TRUE bit DECLARE @FALSE bit SET @TRUE = 1 SET @FALSE = 0 select * from SomeTable where @TRUE = @TRUE
Diese sind jedoch nur im Rahmen des Stapels vorhanden (Sie müssen sie in jedem Stapel, in dem Sie sie verwenden möchten, neu deklarieren).
quelle
case when exists( select 1 from project.quota_group_supplier qgs with (nolock) where qgs.project_quota_id=qg.project_quota_id) then @TRUE else @FALSE end
Sie können die Werte
'TRUE'
und verwenden'FALSE'
. Von https://docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql :quelle
select 'TRUE' where 'TRUE'
. Weder kann es im Auswahlkontext sinnvoll verwendet werden, noch funktioniert die where-Klausel. Der SQL-Parser beschwert sich darüber, dass 'TRUE' nicht boolesch ist. Ebensoselect TRUE where TRUE
ist in beiden Teilen ungültig. Alles in allem. Es funktioniert im Allgemeinen nicht unter MS-SQL.WHERE column = 'TRUE'
oderIF @value = 'FALSE'
.Es gibt keine solche Sache.
Sie müssen den Wert mit etwas vergleichen, das verwendet
= < > like ...
. Der Bit, der in SQL Server am nächsten kommt, ist das Bit . Und das ist eine ganze Zahl, die die Werte haben kannnull
,0
und1
.quelle
Sie sollten berücksichtigen, dass ein "wahrer Wert" alles außer 0 und nicht nur 1 ist. Anstelle von 1 = 1 sollten Sie also 1 <> 0 schreiben.
Denn wenn Sie den Parameter (@param <> 0) verwenden, kann es zu Konvertierungsproblemen kommen.
Am bekanntesten ist Access, das den True-Wert bei der Steuerung als -1 anstelle von 1 übersetzt.
quelle
Ich bezweifle den Wert der Verwendung eines Booleschen Werts in TSQL. Jedes Mal, wenn ich anfing, mir Boolesche und For-Schleifen zu wünschen, wurde mir klar, dass ich mich dem Problem wie ein C-Programmierer und nicht wie ein SQL-Programmierer näherte. Das Problem wurde trivial, als ich den Gang wechselte.
In SQL bearbeiten Sie SETs von Daten. "WHERE BOOLEAN" ist unwirksam, da es das Set, mit dem Sie arbeiten, nicht ändert. Sie müssen jede Zeile mit etwas vergleichen, damit die Filterklausel wirksam wird. Die Tabelle / Ergebnismenge ist eine iEnumerable, die SELECT-Anweisung ist eine FOREACH-Schleife.
Ja, "WHERE IsAdmin = True" ist besser zu lesen als "WHERE IsAdmin = 1".
Ja, "WHERE True" wäre schöner als "WHERE 1 = 1, ...", wenn TSQL dynamisch generiert wird.
und vielleicht kann das Übergeben eines Booleschen Werts an einen gespeicherten Prozess eine if-Anweisung lesbarer machen.
Aber meistens, je mehr IFs, WHILEs und Temp-Tabellen Sie in Ihrer TSQL haben, desto wahrscheinlicher ist es, dass Sie sie umgestalten.
quelle
Ich hoffe, dies beantwortet die Absicht der Frage. Obwohl es in SQL Server keine Booleschen Werte gibt, lautete der Ausdruck, der in Access funktioniert, "... WHERE Foo" (Foo ist der Name der booleschen Spalte), wenn Sie eine Datenbank mit Booleschen Typen haben, die aus Access übersetzt wurden. Es kann durch "... WHERE Foo <> 0" ersetzt werden ... und das funktioniert. Viel Glück!
quelle
Sie können 'True'- oder' False'-Zeichenfolgen verwenden, um Bolean-Typdaten zu simulieren.
Select * From <table> Where <columna> = 'True'
Ich denke, dieser Weg ist vielleicht langsamer als nur 1, weil er mit der Convert_implicit-Funktion aufgelöst wird.
quelle
select * from SomeTable where null is null
oder
select * from SomeTable where null is not null
Vielleicht ist dies die beste Leistung?
quelle