这很难做的一个原因是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列是可空的。同样,如果你希望避免三值布尔逻辑,你必须确保你的表达式输入都不能为空。
我想了一下使用CASE声明的第二个,但我很快就认为这是一个讨厌的黑客! :P(是我还是SQL语法有时是如此奇怪)无论如何,感谢您的帮助! :-) – 2011-02-26 13:02:17
将这个老的,接受的答案downvoter请留下评论。谢谢。 – 2011-07-24 00:01:40