Unterschied zwischen "und" und "&"

13

Ich versuche, die Rangfolge für logische Operationen zu verstehen und habe den folgenden Code:

declare @T bit ='TRUE'
declare @F bit ='False'

print @T and @F

und es gibt einen Fehler als zurück

Falsche Syntax neben dem Schlüsselwort 'und'.

Ich habe 'und' durch '&' ersetzt und der Code funktioniert wieder. Warum hat der frühere Code nicht funktioniert? Ich benutze SQL Server.

Jason
quelle

Antworten:

29
print @T & @F

Kehrt zurück 0

&ist der bitweise AND- Operator.

Der & bitweise Operator führt ein bitweises logisches UND zwischen den beiden Ausdrücken aus, wobei jedes entsprechende Bit für beide Ausdrücke verwendet wird. Die Bits im Ergebnis werden genau dann auf 1 gesetzt, wenn beide Bits (für das aktuelle aufzulösende Bit) in den Eingabeausdrücken den Wert 1 haben. Andernfalls wird das Bit im Ergebnis auf 0 gesetzt.

@T & @FLöst in Ihrem Fall auf 1 & 0und gibt so ein Ergebnis des Datentyps BITmit Wert zurück0

Bei der Übergabe an den PRINTOperator wird dieses bitErgebnis implizit in einen String umgewandelt und das Ergebnis an den Client ausgegeben.


print @T and @F

Hat ziemlich viel falsch gemacht.

AND

Kombiniert zwei Boolesche Ausdrücke und gibt TRUE zurück, wenn beide Ausdrücke TRUE sind

bitist nicht dasselbe wie boolesch. Sie sind nicht austauschbar und SQL Server wird bitbei Bedarf nicht implizit in einen booleschen Datentyp umgewandelt (SQL Server implementiert den booleschen SQL-Datentyp nicht).

Sie müssten also einen Ausdruck wie "" verwenden

@T = 'TRUE' AND @F = 'TRUE'

Anstatt von

@T and @F

Auch dann sind Ihre Probleme noch nicht PRINTgelöst. Akzeptiert ohnehin keinen booleschen Ausdruck. Sie können den folgenden Ausdruck verwenden CASE.

PRINT CASE 
          WHEN     (@T = 'TRUE' AND @F = 'TRUE') THEN 'True' 
          WHEN NOT (@T = 'TRUE' AND @F = 'TRUE') THEN 'False' 
          ELSE 'Unknown' -- SQL uses three valued logic
      END
Martin Smith
quelle
Danke für deine Antwort! Daraus habe ich wirklich viel gelernt!
Jason