2009-11-19 8 views
10

Я нашел этот фрагмент SQL в представлении, и я довольно озадачен его цель (фактическое SQL укоротить для краткости):COALESCE с NULL

SELECT 
    COALESCE(b.Foo, NULL) AS Foo 

FROM a 
LEFT JOIN b ON b.aId=a.Id 

Я не могу думать о единственной причине с целью сливающихся с нулем вместо того, чтобы просто сделать это:

SELECT 
    b.Foo AS Foo 

FROM a 
LEFT JOIN b ON b.aId=a.Id 

Или, по крайней мере, не включают в себя NULL в явном виде:

SELECT 
    COALESCE(b.Foo) AS Foo 

FROM a 
LEFT JOIN b ON b.aId=a.Id 

Я не знаю, кто автор этого (поэтому я не могу спросить), когда он был автором, или для какой конкретной версии MS SQL Server он был написан (до 2008 года наверняка, хотя).

Есть ли веская причина объединиться с NULL вместо простого выбора столбца? Я не могу не смеяться и записывать это как ошибку новобранец, но это заставляет задуматься, есть ли какие-то «бахромы», о которых я не знаю.

+2

Похоже на ошибку новобранец. –

+4

Или требование несколько раз менялось, поэтому этот запрос несколько раз менялся разными разработчиками. Возможно, COALESCE (b.Foo, NULL) раньше был COALESCE (b.Foo, [some value/expression]). Затем требование изменилось. Так что кто-то просто изменился на COALESCE (b.Foo, NULL), не задумываясь. – David

+0

Возможно, это был хакерский способ вызвать ошибку, если b.Foo был NULL. Является ли это действительным или нет, это другой вопрос. – Mike

ответ

11

Вы правы - нет никаких оснований для использования:

SELECT COALESCE(b.Foo, NULL) 

... потому что если b.foo является NULL, вы можете также просто использовать:

SELECT b.foo 

... при условии, что вы хотите знать, если значение равно null.

4

Я думаю, что может быть быть кромкой кромки, но это очень исторический факт - это немного догадка, но он может окружать ситуацию, когда b.foo = '', например. строка пробелов.

Вернитесь достаточно далеко в SQL, и LTrim ('') вернул null (6/6.5), поэтому мне интересно, оценил ли Coalesce на пустой строке также его значение null, если бы это было так, то механизм использовался превращать только строки пробелов в нулевые значения? (Если все значения будут оцениваться как null, Coalesce вернет Null.)

Это предположение, и я не могу проверить его сразу, но его не должно быть сложно проверить.

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