T-SQL中的布尔'NOT'不能处理'bit'数据类型?

时间:2008-10-07 09:35:25

标签: sql sql-server tsql boolean-operations

尝试执行单个布尔NOT操作,似乎在MS SQL Server 2005下,以下块不起作用

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = NOT @MyBoolean;
SELECT @MyBoolean;

相反,我用

取得了更大的成功
DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = 1 - @MyBoolean;
SELECT @MyBoolean;

然而,这看起来像是一种扭曲的方式来表达像否定一样简单的东西。

我错过了什么吗?

7 个答案:

答案 0 :(得分:140)

使用〜运算符:

DECLARE @MyBoolean bit
SET @MyBoolean = 0
SET @MyBoolean = ~@MyBoolean
SELECT @MyBoolean

答案 1 :(得分:25)

您的解决方案很好......您也可以使用此语法在SQL中进行切换......

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = @MyBoolean ^ 1; 
SELECT @MyBoolean;

答案 2 :(得分:21)

从1中减去这个值看起来就好了,但就表达意图而言,我认为我更愿意这样做:

SET @MyBoolean = CASE @MyBoolean WHEN 0 THEN 1 ELSE 0 END

它更冗长,但我认为它更容易理解。

答案 3 :(得分:9)

在SQL 2005中,没有真正的布尔值,位值实际上是其他东西。

一个位可以有三个状态,1,0和null(因为它是数据)。 SQL不会自动将这些转换为true或false(虽然令人困惑的SQL企业管理器会)

考虑逻辑中的位字段的最佳方法是1或0的整数。

如果直接在位字段上使用逻辑,它将表现得像任何其他值变量 - 即如果逻辑值为(任何值)则逻辑为真,否则为false。

答案 4 :(得分:8)

要指定反转位,您需要使用按位NOT运算符。使用按位NOT运算符'〜'时,必须确保将列或变量声明为位。

这不会给你零:

Select ~1 

这将:

select ~convert(bit, 1)

这样:

declare @t bit
set @t=1
select ~@t

答案 5 :(得分:5)

BIT是一种数字数据类型,而不是布尔值。这就是为什么你不能对它应用布尔运算符的原因 SQL Server没有BOOLEAN数据类型(不确定SQL SERVER 2008)所以你必须坚持使用@Matt Hamilton的解决方案。

答案 6 :(得分:4)

使用ABS获取绝对值(-1变为1)......

DECLARE @Trend AS BIT
SET @Trend = 0
SELECT @Trend, ABS(@Trend-1)