2010-04-21 19 views
9

Esiste una funzione in SQL Server 2005 che restituisce NULL [o un valore booleano] se qualsiasi degli argomenti (di qualsiasi tipo) è NULL, il che mi salverà dallo scrivere IF a IS NULL OR b IS NULL OR c IS NULL ....Inversa di COALESCE

+0

@ Michael B: Probabilmente t l'ultimo elemento nella lista poiché non è nullo e sarà sufficiente. L'attenzione è NULL, quindi anche se un valore non NULL è importante, il valore effettivo è irrilevante. –

+0

Anche NULL, perché * qualsiasi * implica * nessuno *. – ercan

+0

@ecran: (Supponendo che il tuo commento sia una risposta a @ Michael B), non annullerebbe lo scopo della funzione che desideri, se restituisci null quando non è presente nulla? Intendo dire che la funzione restituirebbe sempre null. –

risposta

4

Ecco un modo moderatamente sgradevole di farlo:

set ansi_nulls off 
if (null in (a, b, c, d, e) print 'got a null' 
set ansi_nulls on 
+4

~ shudders alle implicazioni ~ – Jeremy

+0

Una severa cautela di Microsoft che NULL può produrre risultati imprevisti in questo scenario: http://msdn.microsoft.com/en-us/library/ms177682.aspx –

+2

+1 per ammettere che questo è moderatamente spiacevole :) – ercan

1

No, il più vicino possibile è NULLIF(), ma non è quello che vuoi. Mi limiterei a usare la dichiarazione OR qui.

+1

In realtà, NULLIF restituisce NULL se i due parametri di input sono uguali. Non vedo alcun modo per ottenere questo risultato con NULLIF in cascata. – ercan

+0

Grazie. Ho misspoke. –

0

Dal momento che i NULL propagare si poteva fare:

(cola + colb + colc) is null 

assumendo tutti i tipi di dati compatibili

+0

Ecco perché ho inserito il vincolo ** di qualsiasi tipo ** nel post;) – ercan

+0

Forse potresti costringerli in un unico tipo, poiché i valori stessi non contano per il test. Forse un po 'nulla? – tloflin

0

ne dite ...

SELECT 
CASE WHEN NULLIF(ISNULL(@testA, 1), @testA) 
     + NULLIF(ISNULL(@testB, 1), @testB) 
     + NULLIF(ISNULL(@testC, 1), @testC) > 0 
    THEN 'Got NULL' 
    ELSE 'NO NULL' 
END 
+0

Questo si occupa del vincolo ** "di qualsiasi tipo" **, ma per motivi di leggibilità, preferisco '@testA IS NULL O @testB È NULL O @testC È NULL' – ercan