2010-07-26 21 views
10

tengo una tabla como éstaSeleccionar una columna específica en función del valor de otra columna

ID | Type | Val0 | Val1 
1 | 0 | A | NULL 
2 | 1 | NULL | B 

necesito seleccionar Val0 cuando el tipo es 0, y Val1 cuando el tipo es 1, y ValN cuando el tipo es N ...

¿Cómo puedo hacer eso?

+0

¿Podría proporcionarnos una muestra de la producción esperada? –

+0

'SELECCIONAR ... DONDE ID = 1 - A' – BrunoLM

+0

Solo un comentario rápido: si tiene tablas como esta, realmente debería considerar un esquema diferente. Es casi seguro que su base de datos no sigue el modelo de relación de entidad. – Borealid

Respuesta

15
SELECT CASE 
      WHEN Type = 0 THEN Val0 
      WHEN Type = 1 Then Val1 
      . 
      . 
      WHEN Type = N Then ValN 
     END 
    FROM tbl 
+0

Esto aparentemente tiene un problema, sin embargo, si está usando una tabla de otra base de datos, porque aparentemente el servidor Sql luego impone un número máximo de casos de 10 ... que es bastante pequeño. – eidylon

3

La forma leí esto, es necesario utilizar UNION:

SELECT a.val0 
    FROM TABLE a 
WHERE a.type = 0 
UNION ALL 
SELECT a.val1 
    FROM TABLE a 
WHERE a.type = 1 
UNION ALL ... 

UNION ALL no elimina los duplicados, y es más rápido que UNION (ya que elimina los duplicados).

Hacer esto de forma dinámica es posible.

+0

Lo interpreté como "devuélveme un valor único basado en el tipo dado". Pero puedes tener toda la razón. Fue bueno pedir un resultado esperado :). – dcp

+0

@dcp: Me han mordido demasiadas veces mis suposiciones incorrectas. Pregunto y espero mientras observo para ver si tenía sentido para otra persona. –

2

Para valores bajos de N, puede hacerlo ad-hoc utilizando la CASE statement, como CASE Type WHEN 0 THEN Val0 WHEN 1 THEN Val1 END. Si su N es más grande, probablemente debería normalizar su base de datos (es decir, poner identificaciones ID => ValN en una tabla diferente).

+0

La declaración CASE funciona bien. La sugerencia de normalización es buena, pero no siempre es posible, cuando se está integrando con la base de datos de otra persona. Desafortunadamente. – eidylon

Cuestiones relacionadas