84

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

然而,这看起来有点扭曲了表达否定之类的简单事物的方式。

我错过了什么吗?

4

7 回答 7

155

使用 ~ 运算符:

DECLARE @MyBoolean bit
SET @MyBoolean = 0
SET @MyBoolean = ~@MyBoolean
SELECT @MyBoolean
于 2008-10-07T10:37:58.663 回答
25

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

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = @MyBoolean ^ 1; 
SELECT @MyBoolean;
于 2008-10-07T09:39:38.453 回答
22

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

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

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

于 2008-10-07T09:42:36.887 回答
13

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

这不会给你零:

Select ~1 

这会:

select ~convert(bit, 1)

这也会:

declare @t bit
set @t=1
select ~@t
于 2012-04-24T14:24:00.157 回答
10

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

一个位可以具有三种状态,1、0 和空(因为它是数据)。SQL 不会自动将这些转换为 true 或 false(尽管 SQL 企业管理器会混淆)

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

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

于 2008-10-07T10:54:15.930 回答
5

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

于 2008-10-07T09:42:24.593 回答
4

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

DECLARE @Trend AS BIT
SET @Trend = 0
SELECT @Trend, ABS(@Trend-1)
于 2010-08-24T16:46:05.560 回答