2009-05-13 65 views
7

Pregunta:Oracle: nombre de columna dinámica en la instrucción de selección

¿Es posible cambiar el nombre de una columna en una instrucción de selección en función de un valor en su conjunto de resultados?

Por ejemplo, si un valor year en un conjunto de resultados es de menos de 1950, el nombre del columna OldYear, de lo contrario el nombre de la columna NewYear. El valor de year en el conjunto de resultados garantiza que será el mismo para todos los registros.

Estoy pensando que esto es imposible, pero aquí fue mi intento fallido para poner a prueba la idea:

select 1 as 
(case 
when 2 = 1 then "name1"; 
when 1 = 1 then "name2") 
from dual; 
+0

¿Por qué necesita esto? ¿O solo tienes curiosidad? – tuinstoel

+0

Tuve una situación en la que esto podría haber sido aplicable y se nos ocurrió una solución mucho mejor a nuestro problema. Hice esta publicación por curiosidad. – Americus

Respuesta

4

no puede activar un nombre de columna en cada fila de un conjunto de resultados. Esto es básico para las bases de datos relacionales. Los nombres de las columnas forman parte de la tabla "encabezado" y un nombre se aplica a la columna debajo de él para todas las filas.


Re comentario: OK, tal vez el OP Americus significa que el resultado es conocido por ser exactamente una fila. Pero independientemente, SQL no tiene sintaxis para soportar un alias dinámico de columna. Los alias de columna deben ser constantes en una consulta.

Incluso SQL dinámico no ayuda, porque tendría que ejecutar la consulta dos veces. Una vez para obtener el valor y una segunda vez para volver a ejecutar la consulta con un alias de columna diferente.

+0

Creo que Americus está asumiendo que solo se devuelve una fila y que el nombre del "encabezado" cambia según el conjunto de resultados. – northpole

+0

Esto es más o menos lo que esperaba. ¡Gracias! – Americus

1

Tendrá algo similar a esto:

select 'select ' || CASE WHEN YEAR<1950 THEN 'OLDYEAR' ELSE 'NEWYEAR' END || ' FROM TABLE 1' from TABLE_WITH_DATA 
1

No hay ninguna buena razón para cambiar el nombre de la columna de forma dinámica - es análogo al nombre de una variable en el código de procedimiento - es sólo una etiqueta que podría consulte más adelante en su código, por lo que no desea que cambie en tiempo de ejecución.

Supongo que lo que realmente está buscando es una forma de formatear el resultado (por ejemplo, para imprimir en un informe) de manera diferente según los datos. En ese caso me gustaría generar el texto del título como una columna separada en la consulta, por ejemplo .:

SELECT 1 AS mydata 
     ,case 
      when 2 = 1 then 'name1' 
      when 1 = 1 then 'name2' 
     end AS myheader 
FROM dual; 

A continuación, el procedimiento de llamada tomaría los valores devueltos para misdatos y myHeader y darles formato para la salida según sea necesario.

2

La forma "correcta" de hacer esto en SQL es tener ambas columnas, y tienen la columna que no es apropiado ser NULL, tales como:

SELECT 
    CASE WHEN year < 1950 THEN year ELSE NULL END AS OldYear, 
    CASE WHEN year >= 1950 THEN year ELSE NULL END AS NewYear 
FROM some_table_with_years; 
Cuestiones relacionadas