Boolean 'NOT' в T-SQL не работает над типом данных 'bit'?

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

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

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

Ответ 1

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

DECLARE @MyBoolean bit
SET @MyBoolean = 0
SET @MyBoolean = [email protected]
SELECT @MyBoolean

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

Select ~1 

Это будет:

select ~convert(bit, 1)

И так будет:

declare @t bit
set @t=1
select [email protected]

Ответ 6

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

Ответ 7

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

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