Подтвердить что ты не робот

В TSQL, как оценивать выражение и назначать его в поле BIT?

Я борюсь за что-то очень простое. Я пытаюсь присвоить результаты булевого выражения переменной BIT.

В принципе, я хотел бы сделать что-то вроде:

DECLARE @is_search_term_empty BIT

SET @is_search_term_empty = (@search_term = '')

где @search_term является NVARCHAR(128), объявленным где-то еще в коде.

Я не могу выработать синтаксис для оценки чего-либо и присвоить его переменной BIT, то есть:

SET @is_search_term_empty = (1 > 2) 

Спасибо.

4b9b3361

Ответ 1

Вы можете сделать это с помощью инструкции 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

Ответ 2

Вы можете просто установить значение по умолчанию для вашей переменной bit, а затем просто применить к ней инструкцию IF:

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

Ответ 3

В SQL 2012 теперь вы можете использовать функцию IIf(). Теперь ваш пример будет выглядеть следующим образом:

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

Это по существу является оператором CASE под капотом, но легче усваивается.

Ответ 4

Одной из причин, почему так сложно сделать, является то, что T-SQL использует трехзначную логическую логику. ИСТИНА и ЛОЖЬ - не единственные варианты; там также НЕИЗВЕСТНО. У нас есть аналогичная концепция со значениями NULL, и существует множество языковых функций для перевода из значений в булевы выражения (=, IS NULL, IS NOT NULL и т.д.), Но нет такой вещи, как IS UNKNOWN, или другие языковые функции для перевода непосредственно из булевого выражения в бит типа данных.

Здесь примерное решение. К сожалению, это требует, чтобы выражение, которое вы тестируете (1 = NULL, здесь), нужно дублировать в коде - вы могли бы избежать этого с помощью sp_executesql и параметров вывода, если вам действительно нужно:

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];

Этот пример основан на том, что NOT (UNKNOWN) возвращает UNKNOWN, а не TRUE. Это, очевидно, зависит от того, что столбец BIT имеет значение NULL. Аналогично, если вы хотите избежать трехзначной логической логики, вы должны убедиться, что ни один из ваших входов выражения никогда не может быть нулевым.