Логическое «НЕ» в T-SQL не работает с типом «бит»? - PullRequest
71 голосов
/ 07 октября 2008

При попытке выполнить одну логическую операцию НЕ, похоже, что в 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 ]

140 голосов
/ 07 октября 2008

Используйте оператор ~:

DECLARE @MyBoolean bit
SET @MyBoolean = 0
SET @MyBoolean = ~@MyBoolean
SELECT @MyBoolean
25 голосов
/ 07 октября 2008

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

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = @MyBoolean ^ 1; 
SELECT @MyBoolean;
21 голосов
/ 07 октября 2008

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

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

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

9 голосов
/ 07 октября 2008

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

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

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

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

8 голосов
/ 24 апреля 2012

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

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

Select ~1 

Это будет:

select ~convert(bit, 1)

Так будет и так:

declare @t bit
set @t=1
select ~@t
5 голосов
/ 07 октября 2008

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

4 голосов
/ 24 августа 2010

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

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