Сравнение битов Nullable - PullRequest
       2

Сравнение битов Nullable

0 голосов
/ 11 апреля 2019

Как лучше всего сравнивать двухбитные значения в Transact-SQL, которые могут быть 0, 1 или NULL?

Например, в хранимой процедуре, которая ОБНОВЛЯЕТ битовый столбец со значением параметра, я бы хотел выполнить обновление, только если значение параметра отличается от значения в таблице (значения в таблице и параметре могут быть 0, 1 или NULL).

Я рассматриваю:

WHERE …
AND (CASE WHEN b=@b OR COALESCE(b,@b) IS NULL THEN 0 ELSE 1 END) = 1

против

WHERE …
AND EXISTS (SELECT b EXCEPT SELECT @b)

Есть ли веская причина предпочитать одно другому? Есть лучший способ сделать это?

В этом случае будет обновлена ​​только одна строка, поэтому я не думаю, что производительность является большой проблемой, если только нет большой разницы.

1 Ответ

1 голос
/ 12 апреля 2019

Поскольку сравниваемые данные обнуляются bit, вы можете использовать Coalesce( B, -1 ) = Coalesce( @B, -1 ), чтобы выполнить сопоставление всех трех значений (0, 1 и NULL), сопоставив их с 0, 1 и -1.

Coalesce следует правилам приоритет типа данных . С учетом bit (B) и int (-1) он преобразует bit в int, так что в результате получается значение int.

Выражение не SARGable , но в этом случае OP заявил, что операция выполняется над одной строкой, уже идентифицированной PK, поэтому производительность сравнения не имеет значения.

Обратите внимание, что это случай ввода значения (-1), которое не может встречаться в типе данных исходных данных (bit). Это не то же самое, что выбрать произвольное магическое значение , которое, вероятно, не произойдет, например, год 1800 слишком далек в прошлом, чтобы когда-либо показываться в столбце DateSold. За исключением недвижимости и прочего.

Бонусный совет:

Удобный способ подтвердить поведение - использовать SQL_Variant_Property для отображения типа данных результата:

declare @B as Bit = 1;
select SQL_Variant_Property( Coalesce( @B, -1 ), 'BaseType' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...