Логическое «НЕ» в T-SQL не работает с типом данных «бит»?

При попытке выполнить одну логическую операцию НЕ оказывается, что в 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 Server?

Guillermo Gutiérrez 24.05.2014 10:14
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
83
1
85 013
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ваше решение хорошее ... вы также можете использовать этот синтаксис для небольшого переключения в SQL ...

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = @MyBoolean ^ 1; 
SELECT @MyBoolean;

Просто для информации, это работает, потому что это побитовая эксклюзивная операция. То же, что и оператор XOR на многих языках. Это в основном то же самое, что и SET @MyBoolean = 1 - @MyBoolean, за исключением того, что здесь используется битовая математика, а не целочисленная. Несмотря на то, что это уместно и работает, это может сбивать с толку людей, не разбирающихся в математике. Подробнее здесь. решение @Jonas Lincoln лучше.

Dan VanWinkle 14.12.2011 23:46

К вашему сведению, это решение работает для вычисляемых полей, тогда как оператор case - нет. Спасибо!

anyeone 20.08.2013 01:23

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, а не немного.

Jonas Lincoln 05.08.2010 18:07

Столбец немного ... может ли иметь значение версия БД?

Martin 10.08.2010 16:53

Я знаю, что это работает в SQL Server 2008. Я делаю это все время. Вопрос касался SQL Server 2005, но я не уверен, работает он там или нет.

Dan VanWinkle 14.12.2011 23:36

Исправление: Согласно MS, это должно работать и в 2005 году. Подробнее здесь.

Dan VanWinkle 14.12.2011 23:49

Хороший ответ, я только что протестировал и отлично работает даже в SQL Server 2000.

Alberto Martinez 09.04.2012 18:04

В 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. Это бессмысленно загадочный и обходной способ сделать это.

underscore_d 18.09.2017 15:31

Чтобы назначить инвертированный бит, вам нужно использовать побитовый оператор НЕ. При использовании побитового оператора НЕ, '~', вы должны убедиться, что ваш столбец или переменная объявлены как бит.

Это не даст вам ноля:

Select ~1 

Это будет:

select ~convert(bit, 1)

Так будет это:

declare @t bit
set @t=1
select ~@t

Другие вопросы по теме