在TSQL中,如何评估一个表达式并将其赋值给BIT字段?

39

我在一件非常简单的事情上遇到了困难。我想将布尔表达式的结果分配给一个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) 
感谢。
4个回答

33

您可以使用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

5
我曾考虑使用CASE语句,但我很快放弃了,认为那是一个恶劣的hack! :P (是我还是SQL语法有时很奇怪)无论如何,感谢您的帮助! :-) - Giuseppe Romagnuolo
4
能否给这个旧的、已被接受的答案投反对票的人请留下评论。谢谢。 - Mitch Wheat

15

从 SQL 2012 开始,您现在可以使用 IIf() 函数。您的示例现在应该是这样的;

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

在实质上,这仍然是一个CASE语句,但更易于理解。


3

您可以为您的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

1
这很难实现的一个原因是T-SQL使用三值布尔逻辑。TRUE和FALSE不是唯一的选项;还有UNKNOWN。我们与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。同样,如果您希望避免三值布尔逻辑,必须确保您的表达式输入中没有任何一个可以为 null。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接