2009-08-26 21 views
5

Tengo una tabla con muchas columnas, decir que tengo columnasSQL cómo encontrar una columna no nula?

A, B, C, D

en cada una de estas columnas, se llena sólo una columna en un mismo registro y los demás siempre serán NULL.

Necesito una instrucción de selección que devolverá la columna de la columna no nula.

he intentado se unen, pero esto devuelve un valor, no la columna a la que pertenece el valor a.

Alguien sabe la forma más sencilla de hacer esto?

+0

consultas SQL sólo pueden valores, nunca volver columnas. Por supuesto, puede interpretar el valor como un nombre de columna. –

+0

sí, usted está en lo correcto, estoy considerando que como una columna contiene un valor no nulo, esa es la columna que me interesa. – Darknight

+0

Esto parece una idea muy mala – finnw

Respuesta

8
SELECT 
    CASE 
     WHEN A IS NOT NULL THEN 'A' 
     WHEN B IS NOT NULL THEN 'B' 
     WHEN C IS NOT NULL THEN 'C' 
     WHEN D IS NOT NULL THEN 'D' 
    END 
FROM 
    MyTable 
+0

¡Excelente esto funcionó! a veces simple es lo mejor, no sé por qué estaba pensando demasiado sobre el problema: o) – Darknight

4

caso Try ...

SELECT 
CASE WHEN A IS NOT NULL THEN 'A' WHEN B IS NOT NULL THEN 'B' WHEN C IS NOT NULL THEN 'C' WHEN D IS NOT NULL THEN 'D' END as NotNullCol, OtherCols 
FROM YourTable 
+0

ok, intentaré esto. – Darknight

2

No es bonita pero esto hace lo que quiere:

select case 
    when a is not null then 'a' 
    when b is not null then 'b' 
    when c is not null then 'c' 
    when d is not null then 'd' 
end 
3

Cada vez que se encuentra tratando de hacer las cosas con conjuntos de varias columnas, se Probablemente tu esquema esté equivocado.

Casi con seguridad sería más fácil separar A, B, C y D en filas separadas en una tabla separada, vincularlas a la fila en la tabla original y crear una consulta de tipo JOIN.

Alternativamente, si sólo uno es siempre no nulo, optaría por dos columnas, el tipo (A, B, C o D) y el valor. Entonces no estás desperdiciando las columnas en cada fila, y las consultas son infinitamente más fáciles (suponiendo que los tipos sean los mismos).

Sin embargo, usted puede haces de esta manera con case:

select case 
    when A is not null then 'A' 
    when B is not null then 'B' 
    when C is not null then 'C' 
    else     'D' 
    end 
from ... 

La sintaxis puede no ser exactamente correcta, tendrá que mirar hacia arriba. Puede iniciar sesión y es algo que suele hacer ya que lo considero un (funciones por fila en seleccione Nunca y escala) mala idea.

+0

Gracias a Pax por este conjunto de información, había pensado en tener solo dos columnas, inicialmente, por ejemplo: ModuleType y ModuleID, ¡pero luego tendría que mantener otra tabla! pero probablemente estés en lo cierto sobre la escala. Creo que en este caso sé que las columnas son muy unlikey cambiar (por ejemplo, escalar) – Darknight

+0

otra mesa en el sentido de una mesa 'de búsqueda' para la ModuleID. también debería haber escrito 'nugget' ups: o) – Darknight

0

Me rediseñar. Es casi una mala idea almacenar datos de esta manera en lugar de hacerlo en una tabla relacionada.

en una tabla relacionada puede consultar más fácilmente la información. También puede limitar más fácilmente la información de que solo se permite un registro, por lo que probablemente tenga una mejor integridad de datos.

tablas Menos no necesariamente significa un acceso más rápido o mejor diseño de bases de datos relacionales. Las tablas relacionadas e indexadas relacionadas con Porper son generalmente bastante buenas. Y aunque pueda pensar que nunca necesitará una quinta columna, las reglas comerciales cambian y he visto muchas cosas que la gente pensó que no necesitarían una expansión que necesitara la escalabilidad.

Cuestiones relacionadas