我正在努力做一些非常简单的事情。我正在尝试将布尔表达式的结果分配给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)
感谢。
答案 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 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列可以为空。同样,如果您希望避免使用三值布尔逻辑,则必须确保您的表达式输入都不能为空。