2011-02-26 715 views
25

Estoy luchando en algo muy simple. Estoy tratando de asignar los resultados de una expresión booleana a una variable BIT.En TSQL, ¿cómo evaluar una expresión y asignarla a un campo BIT?

Básicamente me gustaría hacer algo como:

DECLARE @is_search_term_empty BIT 

SET @is_search_term_empty = (@search_term = '') 

donde @search_term es una NVARCHAR(128) declarado en alguna parte del código.

no puedo trabajar a cabo la sintaxis para evaluar algo y asignarlo a una BIT variable, es decir:

SET @is_search_term_empty = (1 > 2) 

Gracias.

Respuesta

23

Usted puede hacer esto con una declaración CASE:

DECLARE @bitvar BIT 
DECLARE @search_term varchar(128) 

set @search_term = 'abc' 

SET @bitvar = CASE 
       WHEN (@search_term = 'abc') THEN 1 
       ELSE 0 
       END 

select @bitvar 
+4

¡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! :-) –

+3

¿Sería el downvoter a esta respuesta antigua, aceptada, por favor deje un comentario. Gracias. –

2

Simplemente puede establecer un valor predeterminado para la variable de bit a continuación, sólo se aplica una declaración IF de esta manera:

DECLARE @bitvar BIT = 0     -- << Default value 
DECLARE @search_term varchar(128) 

set @search_term = 'abc' 
IF (@search_term = 'abc') SET @bitvar = 1 -- << Value changes if required 

select @bitvar 
1

Desde SQL 2012 ahora puede usar la función IIf(). Tu ejemplo ahora se vería así;

DECLARE @is_search_term_empty BIT = IIf(@search_term = '', 1, 0); 

Esto sigue siendo esencialmente una declaración CASE bajo el capó, pero es más fácil de digerir.

0

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.

Cuestiones relacionadas