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