T-SQL中的'NOT'布尔值不能处理'bit'数据types?
试图执行一个布尔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;
然而,这看起来有点扭曲的方式来expression一些简单的否定。
我错过了什么吗?
使用〜运算符:
DECLARE @MyBoolean bit SET @MyBoolean = 0 SET @MyBoolean = ~@MyBoolean SELECT @MyBoolean
你的解决scheme是一个很好的…你也可以使用这个语法在SQL中切换一点…
DECLARE @MyBoolean bit; SET @MyBoolean = 0; SET @MyBoolean = @MyBoolean ^ 1; SELECT @MyBoolean;
从1减去这个值看起来好像能做到这一点,但就expression意图而言,我认为我更喜欢这样做:
SET @MyBoolean = CASE @MyBoolean WHEN 0 THEN 1 ELSE 0 END
这是更详细的,但我认为这是更容易理解。
在SQL 2005中没有一个真正的布尔值,位值是真的。
一个位可以有三个状态,1,0和null(因为它是数据)。 SQL不会自动将它们转换为true或false(尽pipeSQL企业pipe理器会令人困惑)
在逻辑中考虑位字段的最好方法是作为1或0的整数。
如果直接在位字段上使用逻辑,它的行为将与其他任何值variables一样 – 即如果逻辑具有值(任何值),则逻辑将为真,否则为逻辑。
要分配一个倒数位,您需要使用按位NOT运算符。 当使用按位NOT运算符'〜'时,您必须确保您的列或variables被声明为一位。
这不会给你零:
Select ~1
这会:
select ~convert(bit, 1)
那么这样做:
declare @t bit set @t=1 select ~@t
BIT是一个数字数据types,不是布尔值。 这就是为什么你不能应用布尔运算符。
SQL Server没有BOOLEAN数据types(不确定SQL SERVER 2008),所以你必须坚持像@Matt Hamilton的解决scheme。
使用ABS
获取绝对值(-1变成1)…
DECLARE @Trend AS BIT SET @Trend = 0 SELECT @Trend, ABS(@Trend-1)