Вопрос

При попытке выполнить единственную логическую операцию НЕ получается, что в 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top