2010-04-21 11 views
9

hay una función en SQL Server 2005 que devuelve NULL [o un valor booleano] si cualquier de los argumentos (de cualquier tipo) es NULL, lo que me evitaría escribir IF a IS NULL OR b IS NULL OR c IS NULL ....inverso de COALESCE

+0

@Michael B: Probablemente t El último artículo en la lista ya que no es nulo y será suficiente. El foco es NULO, por lo tanto, aunque un valor no NULO es importante, el valor real es irrelevante. –

+0

También NULL, porque * any * implica * none *. – ercan

+0

@ecran: (Suponiendo que su comentario sea una respuesta a @Michael B), ¿no vencería eso el propósito de la función que desea, si devuelve nulo cuando no hay nulo presente? Quiero decir que la función siempre devolverá nulo. –

Respuesta

4

Aquí es una forma moderadamente desagradable de hacerlo:

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

~ estremecimientos en las implicaciones ~ – Jeremy

+0

Una severa advertencia de Microsoft de que NULL puede producir resultados inesperados en este escenario: http://msdn.microsoft.com/en-us/library/ms177682.aspx –

+2

+1 por admitir que esto es moderadamente desagradable :) – ercan

1

No, lo más cercano que obtiene es NULLIF(), pero eso no es lo que quiere. Me limitaría a usar la declaración O aquí.

+1

En realidad, NULLIF devuelve NULL si los dos parámetros de entrada son los mismos. No veo ninguna manera de lograr esto con NULLIF en cascada. – ercan

+0

Gracias. Me equivoqué. –

0

Desde NULL propagan que podría hacer:

(cola + colb + colc) is null 

suponiendo que todos los tipos de datos compatibles

+0

Es por eso que puse la restricción ** de cualquier tipo ** en la publicación;) – ercan

+0

Tal vez podría forzarlos en un solo tipo, ya que los valores en sí mismos no importan para la prueba. Tal vez un poco nullable? – tloflin

0

¿Qué tal ...

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

Esto se ocupa de la restricción de ** "de cualquier tipo" **, pero en aras de la legibilidad, preferiría '@testA IS NULL O @testB IS NULL O @testC IS NULL' – ercan