Diferença entre "e" e "&"


13

Estou tentando entender a ordem de precedência para operações lógicas e ter o seguinte código:

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

print @T and @F

e retorna um erro como

Sintaxe incorreta perto da palavra-chave 'e'.

Substituí 'e' por 'e', ​​e o código funciona novamente. Por que o código anterior não funcionou? Estou usando o servidor SQL.

Respostas:


29
print @T & @F

Devoluções 0

&é o operador Bitwise AND .

O operador & bit a bit executa um AND lógico bit a bit entre as duas expressões, utilizando cada bit correspondente para ambas as expressões. Os bits no resultado são definidos como 1 se e somente se os dois bits (para o bit atual que está sendo resolvido) nas expressões de entrada tiverem o valor 1; caso contrário, o bit no resultado será definido como 0.

No seu caso, @T & @Fresolve 1 & 0e retorna um resultado do tipo de dados BITcom valor0

Quando passado para o PRINToperador, esse bitresultado é convertido implicitamente em string e a saída do resultado para o cliente.


print @T and @F

Tem muito errado com isso.

AND

Combina duas expressões booleanas e retorna TRUE quando ambas as expressões são TRUE

bitnão é o mesmo que booleano. Eles não são intercambiáveis ​​e o SQL Server não será convertido implicitamente bitem um tipo de dados booleano quando necessário (o SQL Server não implementa o tipo de dados booleano do SQL).

Então você precisaria usar uma expressão como

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

ao invés de

@T and @F

Mesmo assim, seus problemas não terminaram - PRINTnão aceita uma expressão booleana. Você pode usar a expressão CASEcomo abaixo.

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

Obrigado pela sua resposta! Eu realmente aprendi muito com isso!
Jason
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.