En TSQL, ¿cómo evaluar una expresión y asignarla a un campo de BITS?


Estoy luchando en algo muy simple. Estoy tratando de asignar los resultados de una expresión booleana a una variable 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 un NVARCHAR(128) declarado en otro lugar del código.

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

SET @is_search_term_empty = (1 > 2) 

Gracias.

Author: Giuseppe Romagnuolo, 2011-02-26

4 answers

Puedes hacer esto con una instrucció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
 25
Author: Mitch Wheat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-26 12:31:30

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

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

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

 4
Author: Mr McGoo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-31 17:31:40

Simplemente puede establecer un valor predeterminado para su bit variable a continuación, simplemente aplicar una IF declaración sobre ella como esta:

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
 2
Author: RAM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-04 16:23:46

Una de las razones por las que esto es tan difícil de hacer es que T-SQL utiliza lógica booleana de tres valores. VERDADERO y FALSO no son las únicas opciones; también hay DESCONOCIDO. Tenemos un concepto similar con valores NULOS, y existen muchas características del lenguaje para traducir de valores a expresiones booleanas(=, IS NULL, IS NOT NULL, etc.), pero no hay tal cosa como IS UNKNOWN, u otras características del lenguaje para traducir directamente de una expresión booleana a un tipo de datos de bits.

Aquí hay una solución de ejemplo. Desafortunadamente esto requiere que la expresión que está probando (1 = NULL, aquí) necesite duplicarse en código -- podría evitar esto con sp_executesql y parámetros de salida si realmente lo necesita:

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 de que NOT(UNKNOWN) devuelve UNKNOWN, not TRUE. Esto obviamente se basa en que tu columna de BITS sea anulable. Del mismo modo, si desea evitar la lógica booleana de tres valores, debe asegurarse de que ninguna de sus entradas de expresión pueda ser nula.

 0
Author: NReilingh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-03 20:55:18