2011-06-07 55 views
5

Tengo una consulta SQL simple (SQL Server 2005) donde selecciono de una tabla que contiene varias columnas que tienen valores BIT. Estas columnas son nulables por lo que pueden contener NULL, 0 o 1.TSQL - ISNULL en varias columnas

Hay un buen número de estas columnas y en mi consulta quiero devolver cero si el valor es NULL. Actualmente estoy usando ISNULL así:

SELECT Name, Age, ISNULL(LikesOranges,0), ISNULL(LikesApples,0), ISNULL(LikesPears,0) 
FROM FoodPreferences 

Como he mencionado, hay una gran cantidad de estas columnas BIT (mucho más que en el sencillo ejemplo anterior). ¿Hay alguna manera de utilizar ISNULL sobre varias columnas como esta:

SELECT ISNULL(*,0) FROM FoodPreferences 

La consulta anterior no funciona, pero se obtiene lo que estoy tratando de hacer - para que pueda evitar tener que escribir una declaración ISNULL para cada columna,

Gracias.

+0

¿Necesita las columnas a ser anulable? – codeulike

+0

Sí, no puedo modificar la tabla de ninguna manera –

Respuesta

7

así puedo evitar tener que escribir un ISNU Instrucción LL para cada columna,

Ejecute esta consulta y copie el resultado en su instrucción de selección. system_type_id = 104 filtra el resultado en bit columnas.

select stuff((select ', isnull('+name+', 0)' 
       from sys.columns 
       where object_id = object_id('FoodPreferences') and 
        system_type_id = 104 
       for xml path('')), 1, 1, '') 

Resultado:

------------------------------------------------------------------------- 
isnull(LikesOranges, 0), isnull(LikesApples, 0), isnull(LikesPears, 0) 
+1

Esta es una solución fantástica al problema: es este tipo de pensamiento creativo el que hace de SO un recurso tan valioso. Gracias. –

3

No lo creo. Pero una opción podría ser crear una vista en esa tabla y poner todas las declaraciones ISNULL en la vista. Al menos entonces no tendrá que hacerlo cada vez

por ej.

CREATE VIEW vwFoodPreferences 
AS 
SELECT Name, 
     Age, 
     ISNULL(LikesOranges,0) AS LikesOranges, 
     ISNULL(LikesApples,0) AS LikesApples, 
     ISNULL(LikesPears,0) AS LikesPears 
FROM FoodPreferences 
2

Lamentablemente, la respuesta simple es no.

Se puede escribir SQL de forma dinámica, pero pase lo que pase, el sql final resultante tendría que ser ISNULL(a,0), ISNULL(b,0), ISNULL(c,0), ISNULL(d,0), etc

5

Prueba esto:

SELECT COALESCE(LikesOranges, LikesApples, LikesPears) AS MyBit FROM FoodPreferences 

Esto devolverá el primer valor no nulo. Si todos los campos son NULL, el resultado es NULL.


ACTUALIZACIÓN:

y la conclusión es:

SELECT ISNULL(COALESCE(LikesOranges, LikesApples, LikesPears),0) AS MyBit FROM FoodPreferences 
+1

No es lo que se pregunta. La pregunta era para obtener todos los datos de columna como parámetro ISNULL. – Dalex

+0

sí, pero está solo a un paso de distancia.Déjalos cocinar la comida finalmente. :) – ibram

+0

Creo que quiere decir que tiene muchas columnas que aceptan nulos, y quiere un ISNULL en la columna eahc por separado (no una combinación de varias columnas) sin tener que escribir cada nombre de columna. – MatBailie

1

Creo que se puede escribir un programa simple y generar cláusula select mediante la lectura de todas las columnas y generar el selecto