При попытке выполнить одну логическую операцию НЕ оказывается, что в 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;
Тем не менее, это выглядит немного извращенным способом выражения чего-то столь же простого, как отрицание.
Я что-то упускаю?
sql
sql-server
tsql
boolean-operations
Джоаннес Верморель
источник
источник
Ответы:
Используйте оператор ~:
DECLARE @MyBoolean bit SET @MyBoolean = 0 SET @MyBoolean = ~@MyBoolean SELECT @MyBoolean
источник
Ваше решение хорошее ... вы также можете использовать этот синтаксис для небольшого переключения в SQL ...
DECLARE @MyBoolean bit; SET @MyBoolean = 0; SET @MyBoolean = @MyBoolean ^ 1; SELECT @MyBoolean;
источник
SET @MyBoolean = 1 - @MyBoolean
за исключением того, что здесь используется битовая математика, а не целочисленная. Несмотря на то, что это уместно и работает, это может сбивать с толку людей, не разбирающихся в математике. Больше информации здесь . @Jonas Линкольна решение лучше.Вычитание значения из 1 выглядит так, как будто это поможет, но с точки зрения выражения намерения я бы предпочел:
SET @MyBoolean = CASE @MyBoolean WHEN 0 THEN 1 ELSE 0 END
Он более подробный, но я думаю, что его немного легче понять.
источник
Чтобы назначить инвертированный бит, вам нужно использовать побитовый оператор НЕ. При использовании побитового оператора НЕ, '~', вы должны убедиться, что ваш столбец или переменная объявлена как бит.
Это не даст вам ноля:
Select ~1
Это будет:
select ~convert(bit, 1)
Так будет это:
declare @t bit set @t=1 select ~@t
источник
В SQL 2005 нет реального логического значения, битовое значение - это что-то другое.
Бит может иметь три состояния: 1, 0 и null (потому что это данные). SQL не преобразует их автоматически в истину или ложь (хотя, как ни странно, менеджер предприятия SQL это сделает)
Лучший способ представить битовые поля в логике - это целое число, равное 1 или 0.
Если вы используете логику непосредственно в битовом поле, она будет вести себя как любая другая переменная-значение - т.е. логика будет истинной, если она имеет значение (любое значение), и ложью в противном случае.
источник
BIT - это числовой тип данных, а не логический. Вот почему к нему нельзя применять логические операторы.
SQL Server не имеет типа данных BOOLEAN (не уверен в SQL SERVER 2008), поэтому вам нужно придерживаться чего-то вроде решения @Matt Hamilton.
источник
Используйте
ABS
для получения абсолютного значения (-1 становится 1) ...DECLARE @Trend AS BIT SET @Trend = 0 SELECT @Trend, ABS(@Trend-1)
источник
-1
вообще могло возникнуть. То есть: не будет, если вычитание выражено в более логичной / интуитивной форме, которую использовал OP. Это бессмысленно загадочный и обходной способ сделать это.