Должен ли я добавить COALESCE во все мои <> сравнения? - PullRequest
0 голосов
/ 23 сентября 2019

Через некоторое время после запуска моего скрипта я понял, что оператор <> работает не так, как должен, или, по крайней мере, когда речь идет о значениях NULL.Многие из моих команд MERGE не попали в блок UPDATE, потому что <> не обнаружил два разных значения.

Поэтому для некоторых сравнений я добавил COALESCE.

Например, вместо

Value1 <> Value2

Я использовал

COALESCE(Value1, '') <> COALESCE(Value2, '')

Вопрос в том, безопасно ли добавлять COALESCE ко всем остальным или это также зависитна тип данных или есть другие предостережения?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Вы можете сделать такое объединение, если ваша система считает, что NULL и строки нулевой длины эквивалентны, то есть: NULL = ''

Если у вас есть огромный список сравнений в вашем операторе слияниявы можете попробовать просто заменить его оператором EXCEPT

WHEN MATCHED AND EXISTS (SELECT SRC.* EXCEPT SELECT TGT.*) THEN
   UPDATE ...

значение NULL по сравнению с NULL неизвестно, но в операциях на основе множеств они ищут отличимость: NULL отличается от ненулевых, но NULLне отличается от другого NULL.

Если строка SRC и строка TGT идентичны, он вернет пустой набор, пропуская обновление.

0 голосов
/ 23 сентября 2019

Команда COALESCE должна использоваться, когда данные могут быть NULL, например, если вы не используете внутреннее соединение, или столбец допускает нулевые значения.По моему личному мнению: не заставляйте систему делать ненужные инструкции, если вы можете их избежать.

Для SQL NULL и NULL - неизвестные значения, они не могут быть равными или разными.Смотрите пример:

declare @vA int
declare @vB int

select @vA, @vB, iif(@vA = @vB, 1, 0), iif(@vA <> @vB, 1, 0)
...