T-SQL中的布尔值“ NOT”不适用于“位”数据类型吗?


81

尝试执行单个布尔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;

但是,这似乎有点扭曲的方式来表达诸如否定之类的简单内容。

我想念什么吗?


Answers:


151

使用〜运算符:

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

11
这是因为您使用的是整数,而不是一点点。
乔纳斯·林肯

4
专栏有点... DB版本可能重要吗?
马丁

我知道这在SQL Server 2008中有效。我一直都这样做。问题是针对SQL Server 2005,我不确定它是否在其中起作用。
Dan VanWinkle 2011年

3
更正:根据MS的说法,这也应该在2005年生效。更多信息在这里
Dan VanWinkle 2011年

3
尼斯的答案,我只是测试它和正常工作,即使是在SQL Server 2000中
阿尔贝托·马丁内斯

25

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

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

1
仅对于FYI,这是有效的,因为它按位互斥操作。与多种语言的XOR运算符相同。SET @MyBoolean = 1 - @MyBoolean除了使用位数学而不是整数数学外,这与其他操作基本相同。即使这是适当且可行的,但对于不懂一点数学的人来说却可能会造成混淆。更多信息在这里。@Jonas Lincoln的解决方案更好。
Dan VanWinkle 2011年

1
仅供参考,此解决方案适用于计算字段,而case语句则不适用。谢谢!
2013年

22

从1减去值似乎可以解决问题,但是就表达意图而言,我认为我更喜欢:

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

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


10

要分配反向位,您需要使用按位NOT运算符。当使用按位NOT运算符“〜”时,必须确保将列或变量声明为bit。

这不会给你零:

Select ~1 

这将:

select ~convert(bit, 1)

因此:

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

9

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

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

在逻辑中考虑位字段的最佳方式是将其作为1或0的整数。

如果直接在位字段上使用逻辑,则其行为将与任何其他值变量相同-即,如果逻辑具有值(任何值),则该逻辑为true;否则为false。


5

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


4

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

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

2
您错过了解释为什么-1会首先出现的原因。也就是说:如果减法以OP使用的更逻辑/直观的方式表示,则不会。这是一种毫无意义的神秘方法。
underscore_d
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.