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