Differenza tra "e" e "&"


13

Sto cercando di capire l'ordine di precedenza per le operazioni logiche e avere il seguente codice:

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

print @T and @F

e restituisce un errore come

Sintassi errata vicino alla parola chiave "e".

Ho sostituito "e" con "&" e il codice funziona di nuovo. Perché il precedente codice non funzionava? Sto usando SQL Server.

Risposte:


29
print @T & @F

ritorna 0

&è l' operatore Bitwise AND .

L'operatore & bitwise esegue un AND logico bit a bit tra le due espressioni, prendendo ciascun bit corrispondente per entrambe le espressioni. I bit nel risultato sono impostati su 1 se e solo se entrambi i bit (per il bit corrente da risolvere) nelle espressioni di input hanno un valore di 1; in caso contrario, il bit nel risultato è impostato su 0.

Nel tuo caso si @T & @Frisolve in 1 & 0e quindi restituisce un risultato di tipo di dati BITcon valore0

Quando viene passato PRINTall'operatore, questo bitrisultato viene implicitamente trasmesso a stringa e l'output del risultato al client.


print @T and @F

Ha parecchio sbagliato in questo.

AND

Combina due espressioni booleane e restituisce VERO quando entrambe le espressioni sono VERE

bitnon è lo stesso booleano. Non sono intercambiabili e SQL Server non eseguirà il cast implicito bitdi un tipo di dati booleano quando necessario (SQL Server non implementa il tipo di dati booleano SQL).

Quindi avresti bisogno di usare un'espressione simile

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

invece di

@T and @F

Anche allora i tuoi problemi non sono finiti PRINT, non accetta comunque un'espressione booleana. È possibile utilizzare l'espressione CASEcome di seguito.

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

Grazie per la tua risposta! Ho davvero imparato molto da quello!
Jason
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.