2013-11-01 2 views
8

Почему выход select nullif(0,'') NULL? (Ожидается 0).Почему вывод select nullif (0, '') равен NULL (ожидается 0)?

Каким образом 0 равно ''?

Когда я использую выберите NULLIF (конвертировать (VARCHAR, 0), '') он фактически возвращает ожидаемый 0.

NULLIF официальная страница говорит функция сравнивает два скалярных выражения. 0 не является скалярным? Пожалуйста, скажите мне, что мне не хватает в моем понимании?

ответ

11

Целое число выше в 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. Кроме того, это приводит к сопоставлению между двумя оценивая к истине.

+0

очень хорошо объяснил приветствия приятеля :) –

+0

Спасибо, Корбин, для объяснения! Это может быть вопрос вне поля, но почему вы не можете сравнить два разных типа данных, так как все данные состоят из символов и если последовательность символов одинакова, то два элемента одинаковы, а если нет - тогда они другой. Или это слишком человечно-искаженный способ мышления? – user2616821

+0

В какой версии sql есть 'SELECT' '= 0' return true? –

1

Возможно ли, что функция nullif лить оба значения либо на тип bit, либо int, что подразумевается первым значением?

Если да, то они оба будут оценивать значение 0, поэтому nullif вернет null, как вы видите.

Это объясняет, почему преобразование в varchar решает проблему.

+0

Он преобразует их в int. – Hogan

+0

Выберите CAST ('' as int) – bummi

+0

Ах, спасибо, я думал, что это был актерский состав, но я не знал, что пустая строка приведет к целому числу 0. –

Смежные вопросы