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

Joa*_*rel 74 sql t-sql sql-server boolean-operations

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

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = NOT @MyBoolean;
SELECT @MyBoolean;
Run Code Online (Sandbox Code Playgroud)

相反,我越来越成功了

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = 1 - @MyBoolean;
SELECT @MyBoolean;
Run Code Online (Sandbox Code Playgroud)

然而,这似乎是一种扭曲的方式来表达像否定一样简单的东西.

我错过了什么吗?

Jon*_*oln 143

使用〜运算符:

DECLARE @MyBoolean bit
SET @MyBoolean = 0
SET @MyBoolean = ~@MyBoolean
SELECT @MyBoolean
Run Code Online (Sandbox Code Playgroud)

  • 这是因为你使用的是int,而不是一点. (11认同)
  • 列有点......数据库版本是否重要? (4认同)
  • 更正:根据MS,这应该也适用于2005年.更多信息[这里](http://msdn.microsoft.com/en-us/library/ms173468(v = SQL.90).aspx). (3认同)
  • 很好的答案,我刚测试它并且工作正常,即使在SQL Server 2000中也是如此. (3认同)
  • 这没有用。将0变成-1,将1变成-2。 (2认同)

Gal*_*ian 25

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

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = @MyBoolean ^ 1; 
SELECT @MyBoolean;
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,这是有效的,因为它按位排他操作。与许多语言中的 XOR 运算符相同。这与执行`SET @MyBoolean = 1 - @MyBoolean` 基本相同,只是它使用位数学而不是整数数学。尽管这是适当的并且有效,但对于不了解位数学的人来说可能会感到困惑。更多信息 [此处](http://msdn.microsoft.com/en-us/library/ms176122.aspx)。@Jonas Lincoln 的 [解决方案](http://stackoverflow.com/questions/177762/boolean-not-in-t-sql-not-working-on-bit-datatype#answer-177893) 更好。 (2认同)

Mat*_*ton 21

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

SET @MyBoolean = CASE @MyBoolean WHEN 0 THEN 1 ELSE 0 END
Run Code Online (Sandbox Code Playgroud)

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


Fis*_*ury 10

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

这不会给你零:

Select ~1 
Run Code Online (Sandbox Code Playgroud)

这将:

select ~convert(bit, 1)
Run Code Online (Sandbox Code Playgroud)

这样:

declare @t bit
set @t=1
select ~@t
Run Code Online (Sandbox Code Playgroud)


Kei*_*ith 9

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

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

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

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


aku*_*aku 5

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