T-SQL中的布尔运算符'NOT'对'bit'数据类型无效?

87

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

然而,这看起来有点扭曲,来表达一个否定的简单概念。

我是否漏掉了什么?


可能是如何在SQL Server中翻转位?的重复问题。 - Guillermo Gutiérrez
7个回答

164

使用 ~ 运算符:

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

11
是因为你使用的是 int 而不是 bit。 - Jonas Lincoln
4
列(Column)有点问题......数据库版本有影响吗? - Martin
我知道这在SQL Server 2008中是有效的。我经常这样做。问题是针对SQL Server 2005的,我不确定它是否在那里有效。 - Dan VanWinkle
3
更正:根据微软的说法,这个方法在2005年版本也能工作。更多信息请参见此处 - Dan VanWinkle
3
好的回答,我刚刚测试了一下,在SQL Server 2000中也能正常工作。 - Alberto Martinez

25

你的解决方案很好...你也可以使用这种语法在SQL中切换一个位...

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

2
只是提供一个信息,这个方法是通过按位异或操作来实现的,就像许多语言中的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)更好。 - Dan VanWinkle
1
作为一种FYI,这个解决方案适用于计算字段,而case语句则不适用。谢谢! - anyeone

22

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

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

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


15
为了将一个位取反,您需要使用按位非运算符。在使用按位非运算符“~”时,您必须确保您的列或变量声明为位(bit)类型。
以下操作不会得到零:
Select ~1 

这将会:

select ~convert(bit, 1)

这样会怎样呢:
declare @t bit
set @t=1
select ~@t

10

在 SQL 2005 中,没有真正的布尔值,位值实际上是另外一些东西。

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

在逻辑中,最好将位字段视为一个整数,其值为 1 或 0。

如果您直接在位字段上使用逻辑,它将像任何其他值变量一样 - 即如果它有值(任何值),则逻辑为 true,否则为 false。


5

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


是的,比尔·盖茨受BASIC语言和他在1975年编写的BASIC解释器的影响如此之深,以至于他从未摆脱它,并在SQL Server中制作了一个真正的布尔类型。我想BASIC中的B确实代表“初学者”,而艾兹格·迪科斯彻一直是正确的! 例如,在标准SQL中,可以说WHERE BoolFieldWHERE NOT BoolField而不是WHERE BitField = 1 - Reversed Engineer

4

使用 ABS 函数获取绝对值(-1 变成 1)...

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

2
你没有解释为什么-1会首先出现。也就是说,如果减法使用OP使用的更逻辑/直观的形式表达,它就不会出现。这是一种毫无意义的神秘和迂回的方式。 - underscore_d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接