2015-10-05 3 views
0
select ISNULL(c.name,'any') from (select Name from Orders where ID = '123') 

select ISNULL((select Name from Orders where ID = '123'),'any') 

Заказы таблице есть две колонкиMSSql ISNULL запрос

1. ID 
2. Name 

и данные в заказах

ID Name 
121 abc 
124 def 

Первый запрос не возвращает результат, тогда как второй запрос дает какой-либо как результат. В чем разница

ответ

1

Первая форма использует подзапрос в качестве источника таблицы в своем предложении FROM; он может возвращаться между нулем и многими строками.

Для каждой строки, в которую возвращается подзапрос, вычисляется выражение ISNULL. Но если в подзапросе нет строк, то окончательный вывод не содержит строк.

Вторая форма использует SELECT без предложения FROM - который всегда будет создавать набор результатов, содержащий ровно одну строку. Затем он также использует подзапрос скаляр (вводя подзапрос в месте, где ожидается скалярное значение) - это должно либо произвести нулевой, либо один результат. Если подзапрос производит нулевые результаты, то заменяется NULL.


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

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