Целое число выше в data type precedence, поэтому varchar преобразуется в int. Пустая строка, преобразованная в int, равна 0
, а оттуда это довольно очевидно (0 == 0
).
0 == 0
, таким образом NULLIF(0, 0) => NULL
(поскольку NULLIF(a, b)
возвращает NULL
тогда и только тогда a == b
)
Когда вы nullif(convert(varchar,0),'')
, вы просто делаете NULLIF('0', '')
. Очевидно, что строка, содержащая только 0 и пустая строка, не равна, поэтому вы получаете 0
.
Более подробное объяснение состоит в том, что на самом деле нельзя сравнивать два разных типа. Вы не можете сравнить строку с целым числом, или с строкой и с плавающей точкой, или с целым числом и с плавающей точкой, или так далее. Это означает, что для сравнения разных типов должно существовать какое-то неявное правило литья. В этом случае бывает так, что если вы сравниваете строку (ну, технически varchar) и int, varchar преобразуется в int неявно. Это намного проще, чтобы увидеть, если учесть следующее:
SELECT CONVERT(INT, '');
IF '' = 0 SELECT 'Equal' ELSE SELECT 'Not equal';
Как вы видите, преобразование дает целое значных 0. Кроме того, это приводит к сопоставлению между двумя оценивая к истине.
очень хорошо объяснил приветствия приятеля :) –
Спасибо, Корбин, для объяснения! Это может быть вопрос вне поля, но почему вы не можете сравнить два разных типа данных, так как все данные состоят из символов и если последовательность символов одинакова, то два элемента одинаковы, а если нет - тогда они другой. Или это слишком человечно-искаженный способ мышления? – user2616821
В какой версии sql есть 'SELECT' '= 0' return true? –