Логическое " не "в 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 68

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

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

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

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