2011-02-26 32 views
25

我在很简单的事情上挣扎。我试图将布尔表达式的结果赋值给BIT变量。在TSQL中,如何评估表达式并将其分配给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) 

感谢。

回答

23

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

我想了一下使用CASE声明的第二个,但我很快就认为这是一个讨厌的黑客! :P(是我还是SQL语法有时是如此奇怪)无论如何,感谢您的帮助! :-) – 2011-02-26 13:02:17

+3

将这个老的,接受的答案downvoter请留下评论。谢谢。 – 2011-07-24 00:01:40

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 
1

从SQL 2012开始,您现在可以使用IIf()函数。你的例子现在看起来像;

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

这实际上仍然是一个CASE语句,但更容易消化。

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列是可空的。同样,如果你希望避免三值布尔逻辑,你必须确保你的表达式输入都不能为空。