Логическое «НЕ» в T-SQL не работает с типом «бит»?
-
05-07-2019 - |
Вопрос
При попытке выполнить единственную логическую операцию НЕ получается, что в 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;
Тем не менее, это выглядит немного извращенным способом выразить что-то столь же простое, как отрицание.
Я что-то упустил?
Решение
Используйте оператор ~:
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 и ноль (потому что это данные). SQL автоматически не преобразует их в true или false (хотя, как это ни удивительно, менеджер предприятия SQL)
Лучший способ думать о битовых полях в логике - это целое число, равное 1 или 0.
Если вы используете логику непосредственно в битовом поле, она будет вести себя как любая другая переменная значения - то есть логика будет истинной, если она имеет значение (любое значение), и ложной в противном случае.
Чтобы назначить инвертированный бит, вам нужно использовать побитовый оператор NOT. При использовании побитового оператора NOT '~' вы должны убедиться, что ваш столбец или переменная объявлены как бит. Р>
Это не даст вам ноль.
Select ~1
Это будет:
select ~convert(bit, 1)
Так и будет:
declare @t bit
set @t=1
select ~@t
BIT - это числовой тип данных, а не логический. Вот почему вы не можете применять к нему логические операторы.
SQL Server не имеет типа данных BOOLEAN (не уверен насчет SQL SERVER 2008), поэтому вам нужно придерживаться чего-то вроде решения @Matt Hamilton.
Используйте ABS
, чтобы получить абсолютное значение (-1 становится 1) ...
DECLARE @Trend AS BIT
SET @Trend = 0
SELECT @Trend, ABS(@Trend-1)