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