Una de las razones por las que esto es tan difícil de hacer es que T-SQL usa una lógica booleana de tres valores. VERDADERO y FALSO no son las únicas opciones; también hay DESCONOCIDO. Tenemos un concepto similar con valores NULL, y existen muchas características de lenguaje para traducir de valores a expresiones booleanas (=
, IS NULL
, IS NOT NULL
, etc.), pero no existe lo que se llama IS UNKNOWN
u otras características del lenguaje para traducir directamente desde expresión booleana a un tipo de datos bit.
Aquí hay una solución de ejemplo. Por desgracia, esto requiere que la expresión que se está probando (1 = NULL
, aquí) necesita ser duplicado en código - se puede evitar esto con parámetros de sp_executesql y salida si realmente necesitaba:
DECLARE @bit1 bit = 0,
@bit2 bit = 0,
@result bit;
IF (1 = NULL) SET @bit1 = 1;
IF NOT(1 = NULL) SET @bit2 = 1;
IF @bit1 = @bit2 SET @result = NULL;
ELSE IF @bit1 = 1 SET @result = 1;
ELSE IF @bit2 = 1 SET @result = 0;
SELECT @result as [bit];
Este ejemplo se basa en el hecho que NOT (UNKNOWN) devuelve UNKNOWN, no TRUE. Obviamente, esto depende de que tu columna BIT sea nulable. De manera similar, si desea evitar la lógica booleana de tres valores, debe asegurarse de que ninguna de sus entradas de expresión pueda ser nula.
¡Pensé por un segundo usar una declaración CASE pero descarté pronto creyendo que era un hack desagradable! : P (¿Es yo o la sintaxis SQL a veces es tan raro) De todos modos, gracias por la ayuda! :-) –
¿Sería el downvoter a esta respuesta antigua, aceptada, por favor deje un comentario. Gracias. –