Diferencia entre "y" y "&"

13

Estoy tratando de entender el orden de precedencia para las operaciones lógicas y tengo el siguiente código:

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

print @T and @F

y devuelve un error como

Sintaxis incorrecta cerca de la palabra clave 'y'.

Reemplacé 'y' con '&', y el código funciona nuevamente. ¿Por qué no funcionó el código anterior? Estoy usando el servidor SQL.

Jason
fuente

Respuestas:

29
print @T & @F

Devoluciones 0

&es el operador Y bit a bit .

El operador & bitwise realiza un AND lógico bit a bit entre las dos expresiones, tomando cada bit correspondiente para ambas expresiones. Los bits en el resultado se establecen en 1 si y solo si ambos bits (para el bit actual que se está resolviendo) en las expresiones de entrada tienen un valor de 1; de lo contrario, el bit en el resultado se establece en 0.

En su caso, @T & @Fresuelve ay 1 & 0devuelve un resultado de tipo de datos BITcon valor0

Cuando se pasa al PRINToperador, este bitresultado se convierte implícitamente en cadena y el resultado se envía al cliente.


print @T and @F

Tiene bastante mal con eso.

AND

Combina dos expresiones booleanas y devuelve VERDADERO cuando ambas expresiones son VERDADERAS

bitNo es lo mismo que booleano. No son intercambiables y SQL Server no se convertirá implícitamente biten un tipo de datos booleano cuando sea necesario (SQL Server no implementa el tipo de datos booleano SQL).

Entonces necesitarías usar una expresión como

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

en lugar de

@T and @F

Incluso entonces sus problemas no han terminado, de PRINTtodos modos no acepta una expresión booleana. Puede usar la expresión de la CASEsiguiente manera.

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
fuente
¡Gracias por tu respuesta! ¡Realmente aprendí mucho de eso!
Jason