2009-11-19 15 views
10

Ho trovato questo frammento di SQL in una vista e sono piuttosto perplesso per il suo scopo (SQL effettivo abbreviato per brevità):COALESCE con NULL

SELECT 
    COALESCE(b.Foo, NULL) AS Foo 

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

non riesco a pensare a una sola ragione dello scopo della coalescenza con null invece di fare questo:

SELECT 
    b.Foo AS Foo 

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

O per lo meno non includono il NULL esplicitamente:

SELECT 
    COALESCE(b.Foo) AS Foo 

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

Non so chi sia stato autore di questo (quindi non posso chiederlo), quando è stato creato, o per quale versione specifica di MS SQL Server è stata scritta (pre-2008 di sicuro però).

C'è qualche motivo valido per fondersi con NULL invece di selezionare direttamente la colonna? Non posso fare a meno di ridere e scriverlo come un errore da principiante, ma mi chiedo se ci sia qualche "caso marginale" che non conosco.

+2

Sembra un errore da principiante per me. –

+4

Oppure il requisito è stato modificato più volte, quindi questa query è stata modificata più volte da diversi sviluppatori. Forse COALESCE (b.Foo, NULL) era COALESCE (b.Foo, [qualche valore/espressione]) prima. Quindi il requisito è cambiato. Quindi qualcuno ha appena cambiato in COALESCE (b.Foo, NULL) senza pensare. – David

+0

Questo potrebbe essere un modo hacky per attivare un errore se b.Foo era NULL. Se sia valido o meno è un'altra domanda. – Mike

risposta

11

Hai ragione - non v'è alcun motivo per utilizzare:

SELECT COALESCE(b.Foo, NULL) 

... perché se b.foo è NULL, si potrebbe anche solo usare:

SELECT b.foo 

... partendo dal presupposto che vuoi per sapere se il valore è nullo.

4

Penso che ci sia potrebbe essere un caso limite, ma è molto storico - è un po 'una supposizione ma potrebbe circondare la situazione in cui b.foo =' 'ad es. una stringa di spazi.

Torna indietro abbastanza in SQL e LTrim ('') ha restituito null (6/6.5), quindi mi chiedo se Coalesce su una stringa vuota anche lo ha valutato su null, se così fosse il meccanismo veniva utilizzato per trasformare solo stringhe di spazi, in valori nulli? (Se tutti i valori sono considerati nulli, Coalesce restituirà Null.)

È un'ipotesi e non posso testarlo subito, ma non dovrebbe essere difficile da controllare.