SQL Server - Boolesches Literal?

76

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.

dpp
quelle
1
Nein, ich möchte nur sehen, ob true in der where-Klausel funktioniert. Zunächst einmal kenne ich das Wort für wahr und falsch nicht.
dpp
4
SQL Server verfügt über keine Daten Booleschen Typen noch die erforderlichen Operatoren IS TRUE, IS UNKNOWNusw. (obwohl der SQL-99 - Standard hat beides). Eine übliche Problemumgehung besteht darin, eine eingeschränkte CHAR(1)Spalte zu verwenden CHECK (col1 IN ('T', 'F')).
Tag, wenn

Antworten:

75

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 - 0oder 1(und ein Nichtwert NULL).

SQL (Standard-SQL sowie T-SQL-Dialekt) beschreibt eine dreiwertige Logik . Der booleschen Typ für SQL sollte 3 Werte unterstützen - TRUE, FALSEund UNKNOWN(und auch den nicht-Wert NULL). Also bitpasst 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.

Damien_The_Unbeliever
quelle
7
Ich frage mich, was das SQL Server-Team dazu gebracht haben könnte, ein Bit anstelle eines booleschen Datentyps (mit den Werten true und false) zu haben. Boolean ist in allen Anwendungsdomänen so natürlich. Ich glaube, sie würden immer noch 1 Byte im Speicher verwenden, um den Bitdatentyp zu speichern. Auch mit internen Speicher , wie wenig haben sie unterstützt könnte Trueund Falseals syntaktischer Zucker in den SQL - Skripte zumindest.
RBT
Die Chancen stehen gut, weil es in C so ist. Es gibt keine solchen Werte trueoder false, 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.
Dragas
39
select * from SomeTable where 1=1
Nocache
quelle
1
Es klappt! Leider ist es kein Literal, das Ergebnis von 1=1ist boolesch wahr, aber es ist kein Literal.
dpp
18

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".

Böhmisch
quelle
1
An expression of non-boolean type specified in a context where a condition is expected, near 'group'Ich benutze MSSQL
dpp
3
Sehr geehrte Downvoter, in der ersten Frage, die ich beantwortet habe , wurde der Servertyp "SQL-Server" nicht angegeben, daher habe ich die generische Frage mit einer generischen Antwort mit dem Vorbehalt "Die meisten Datenbanken" beantwortet. Ich verstehe nicht, warum dies eine Ablehnung verdient.
Böhmisch
1
Sie sollten Ihre Antwort besser entfernen, bevor Sie weitere Abstimmungen erhalten. Irgendwie ist es meine Schuld, dass ich nur SQLnicht angegeben habe MSSQL.
dpp
2
@dpp ist die Antwort jetzt akzeptabel? Ich habe eine Alternative angegeben, die alle Datenbanken akzeptieren werden
Bohemian
2
Jeder Microsoft SQL-Server ist ein SQL-Datenbankserver, aber nicht jeder SQL-Datenbankserver ist ein Microsoft SQL-Server. So wie jeder Apfel eine Frucht ist, aber nicht jede Frucht ein Apfel (oder vielleicht im MS-Fall eine Birne :)
Reversed Engineer
17

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

IF CONVERT(bit, 0) = 0

Es ist also nicht besonders nützlich.

Sam
quelle
16

Laut Microsoft : Syntax für die Suche ist

[ WHERE <search_condition> ]*

Und die Suchbedingung ist:

<search_condition> ::= 
    { [ NOT ] <predicate> | ( <search_condition> ) } 
    [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ] 
[ ,...n ] 

Und Prädikat ist:

<predicate> ::= 
    { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression 

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:

SEARCH * FROM Somewhere WHERE 'True'='True' 
Dalex
quelle
8

SQL Server hat keine wörtlichen wahren oder falschen Werte. Sie müssen die verwenden1=1In 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).

Daniel Renshaw
quelle
1
Dies funktioniert nicht wie in den obigen Antworten erläutert. "Ein Ausdruck vom nicht-booleschen Typ, der in einem Kontext angegeben wird, in dem eine Bedingung in der Nähe von '@TRUE' erwartet wird"
Mike Chamberlain
2
+1 das hat bei mir funktioniert incase 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
Maslow
6

Sie können die Werte 'TRUE'und verwenden 'FALSE'. Von https://docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql :

Die Zeichenfolgenwerte TRUE und FALSE können in Bitwerte konvertiert werden: TRUE wird in 1 und FALSE in 0 konvertiert.

Matt H.
quelle
1
Könnten Sie klarstellen, was Sie meinen? In WHERE-Klauseln sollte es gut funktionieren.
Matt H
1
ZB 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. Ebenso select TRUE where TRUEist in beiden Teilen ungültig. Alles in allem. Es funktioniert im Allgemeinen nicht unter MS-SQL.
Sebastian Mach
1
Ok, aber es funktioniert beim Vergleichen eines Werts wie WHERE column = 'TRUE'oder IF @value = 'FALSE'.
Matt H
5

Wie schreibe ich einen literalen booleschen Wert in SQL Server?
Wählen Sie * aus SomeTable, wo PSEUDO_TRUE

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 kann null, 0und 1.

Mikael Eriksson
quelle
2

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.

Marco Guignard
quelle
1

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.

David Lean
quelle
1

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!

den232
quelle
1

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.

Fabio 2st
quelle
-1
select * from SomeTable where null is null

oder

select * from SomeTable where null is not null

Vielleicht ist dies die beste Leistung?

sergey
quelle