Логическое " не "в T-SQL не работает с типом данных "бит"?

попытка выполнить одну логическую операцию 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;

тем не менее, это выглядит немного искаженным способом выразить что-то простое, как отрицание.

Я что-то пропустила?

7 ответов


использовать оператор~:

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

ваше решение является хорошим... вы также можете использовать этот синтаксис для переключения бит в SQL...

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

вычитание значения из 1 похоже, что это сделает трюк, но с точки зрения выражения намерения я думаю, что предпочел бы пойти с:

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

это более многословно, но я думаю, что это немного легче понять.


в SQL 2005 нет реального логического значения, битовое значение-это что-то другое.

бит может иметь три состояния: 1, 0 и null (потому что это данные). SQL не преобразует их автоматически в true или false (хотя, путано SQL enterprise manager будет)

лучший способ думать о битовых полях в логике - это целое число, равное 1 или 0.

Если вы используете логику непосредственно в битовом поле, она будет вести себя как любая другая переменная значения-т. е. логика будет истинной, если она имеет значение (любое значение) и ложной в противном случае.


чтобы назначить перевернутый бит, вам нужно будет использовать побитовый оператор NOT. При использовании побитового оператора NOT " ~ " вы должны убедиться, что ваш столбец или переменная объявлены как бит.

Это не даст вам нуль:

Select ~1 

Это:

select ~convert(bit, 1)

вот это:

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

BIT-это числовой тип данных, а не логический. Вот почему вы не можете применить к нему логические операторы.
SQL Server не имеет логического типа данных (не уверен в SQL SERVER 2008), поэтому вам нужно придерживаться чего-то вроде решения @Matt Hamilton.


использовать ABS чтобы получить абсолютное значение (-1 становится 1)...

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