Différence entre «et» et «&»

13

J'essaie de comprendre l'ordre de priorité des opérations logiques et d'avoir le code suivant:

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

print @T and @F

et il renvoie une erreur comme

Syntaxe incorrecte près du mot clé "et".

J'ai remplacé 'et' par '&', et le code fonctionne à nouveau. Pourquoi l'ancien code ne fonctionnait-il pas? J'utilise SQL Server.

Jason
la source

Réponses:

29
print @T & @F

Retour 0

&est l' opérateur ET au niveau du bit .

L'opérateur & au niveau du bit effectue un ET logique au niveau du bit entre les deux expressions, en prenant chaque bit correspondant pour les deux expressions. Les bits du résultat sont mis à 1 si et seulement si les deux bits (pour le bit en cours de résolution) dans les expressions d'entrée ont une valeur de 1; sinon, le bit du résultat est mis à 0.

Dans votre cas, @T & @Frésout 1 & 0et renvoie donc un résultat de type de données BITavec une valeur0

Lorsqu'il est transmis à l' PRINTopérateur, ce bitrésultat est implicitement converti en chaîne et le résultat est envoyé au client.


print @T and @F

A pas mal de mal avec ça.

AND

Combine deux expressions booléennes et renvoie VRAI lorsque les deux expressions sont VRAIES

bitn'est pas le même que booléen. Ils ne sont pas interchangeables et SQL Server ne sera pas implicitement converti biten un type de données booléen en cas de besoin (SQL Server n'implémente pas le type de données booléen SQL.).

Vous devez donc utiliser une expression comme

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

au lieu de

@T and @F

Même alors, vos problèmes ne sont pas terminés - PRINTn'accepte pas une expression booléenne de toute façon. Vous pouvez utiliser l'expression CASEci-dessous.

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
la source
Merci pour votre réponse! J'ai vraiment beaucoup appris de ça!
Jason