2008-10-07 160 views
64

试图执行一个布尔NOT操作,似乎在MS SQL Server 2005中,以下块不起作用T-SQL中的布尔'NOT'无法处理'位'数据类型?

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

相反,我正在与

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

更成功然而,这看起来有点扭曲,表达某种简单的否定。

我错过了什么吗?

+0

可能重复[我如何翻转位SQL Server?](http://stackoverflow.com/questions/171173/how-do-i-flip-a-bit-in-sql-server) – 2014-05-24 06:14:09

回答

130

使用〜运算符:

DECLARE @MyBoolean bit 
SET @MyBoolean = 0 
SET @MyBoolean = [email protected] 
SELECT @MyBoolean 
24

您的解决方案是一个很好的......你也可以使用这个语法来切换一个位SQL ...

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

此解决方案确实工作......谢谢。 – Martin 2010-08-03 13:57:39

+0

仅供参考,这是可行的,因为它按位独占操作。与许多语言的XOR运算符相同。这与“SET @MyBoolean = 1 - @ MyBoolean”基本相同,只是它使用位数学而不是整数数学。即使这是适当的并且有效,对于不了解位数学的人可能会感到困惑。更多信息[这里](http://msdn.microsoft.com/en-us/library/ms176122.aspx)。 @Jonas林肯的[解决方案](http://stackoverflow.com/questions/177762/boolean-not-in-t-sql-not-working-on-bit-datatype#answer-177893)更好。 – 2011-12-14 19:46:10

+0

作为供参考,此解决方案适用于计算字段,而案例陈述不适用。谢谢! – anyeone 2013-08-19 21:23:01

4

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

20

减去1层的外观价值像它会做的伎俩,但在表达意图方面,我想我更愿意去用:

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

它更冗长,但我认为这是一个小更容易理解。

8

在2005年SQL没有一个真正的布尔值,位值是别的东西真的。

有点可以有三个状态,1,0和null(因为它是数据)。 SQL不会自动转换这些为true或false(虽然,容易混淆的SQL企业管理器将)

想到位字段的逻辑是作为一个整数。如果您使用的是1或0

的最佳方式逻辑直接在位字段上,它的行为将与其他任何值变量一样 - 即如果逻辑具有值(任何值),则逻辑将为真,否则为真。

2

使用ABS得到绝对值(-1变为1)...

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

要指定一个倒位,则需要使用按位NOT运算符。当使用按位NOT运算符'〜'时,您必须确保您的列或变量被声明为一位。

这不会给你零:

Select ~1 

这将:

select ~convert(bit, 1) 

所以将这样的:

declare @t bit 
set @t=1 
select [email protected]