在TSQL中,如何计算表达式并将其分配给BIT字段?

时间:2011-02-26 12:27:13

标签: sql tsql sql-server-2008

我正在努力做一些非常简单的事情。我正在尝试将布尔表达式的结果分配给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 个答案:

答案 0 :(得分:27)

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

答案 1 :(得分:6)

From SQL 2012 you can now use the IIf() function. Your example would now look like;

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

This is still essentially a CASE statement under the hood but is easier to digest.

答案 2 :(得分: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 :(得分:0)

这很难做到的原因之一是T-SQL使用三值布尔逻辑。 TRUE和FALSE不是唯一的选择;还有UNKNOWN。我们有一个类似的概念与NULL值,并且存在许多语言功能可以将值从值转换为布尔表达式(=IS NULLIS 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列可以为空。同样,如果您希望避免使用三值布尔逻辑,则必须确保您的表达式输入都不能为空。