Różnica między „i” a „&”

13

Próbuję zrozumieć kolejność wykonywania operacji logicznych i mam następujący kod:

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

print @T and @F

i zwraca błąd jako

Niepoprawna składnia w pobliżu słowa kluczowego „i”.

Zamieniłem „i” na „&”, a kod znów działa. Dlaczego poprzedni kod nie działał? Używam serwera SQL.

Jason
źródło

Odpowiedzi:

29
print @T & @F

Zwroty 0

&jest operatorem bitowym AND .

Operator bitowy wykonuje logikę bitową AND między dwoma wyrażeniami, przyjmując każdy odpowiedni bit dla obu wyrażeń. Bity w wyniku są ustawione na 1 wtedy i tylko wtedy, gdy oba bity (dla rozstrzyganego bieżącego bitu) w wyrażeniach wejściowych mają wartość 1; w przeciwnym razie bit w wyniku jest ustawiony na 0.

W twoim przypadku @T & @Frozwiązuje 1 & 0i zwraca wynik typu danych BITo wartości0

Po przekazaniu do PRINToperatora bitwynik ten jest domyślnie rzutowany na ciąg znaków, a wynik przekazywany do klienta.


print @T and @F

Ma z tym całkiem sporo do czynienia.

AND

Łączy dwa wyrażenia logiczne i zwraca PRAWDA, gdy oba wyrażenia są PRAWDA

bitto nie to samo, co boolean. Nie można ich zamieniać, a SQL Server nie będzie pośrednio przesyłany bitdo typu danych boolowskich, gdy zajdzie taka potrzeba (SQL Server nie implementuje typu danych boolowskich SQL.).

Więc musisz użyć wyrażenia podobnego do

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

zamiast

@T and @F

Nawet wtedy twoje problemy się nie skończyły - i PRINTtak nie akceptuje wyrażenia boolowskiego. Możesz użyć wyrażenia CASEjak poniżej.

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
źródło
Dziękuję za odpowiedź! Naprawdę wiele się z tego nauczyłem!
Jason