2009-05-13 5 views
7

Question:Oracle - nom de colonne dynamique dans l'instruction select

Est-il possible de modifier un nom de colonne dans une instruction select en fonction d'une valeur de son jeu de résultats?

Par exemple, si une valeur year dans un jeu de résultats est inférieur à 1950, nommez la colonne OldYear, nom sinon la colonne NewYear. La valeur year dans le jeu de résultats est garantie être la même pour tous les enregistrements.

Je pense cela est impossible, mais ici était ma tentative avortée de tester l'idée:

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

Pourquoi avez-vous besoin? Ou êtes-vous simplement curieux? – tuinstoel

+0

J'ai eu une situation où cela aurait pu être applicable et nous avons trouvé une bien meilleure solution à notre problème. J'ai fait ce post par curiosité. – Americus

Répondre

4

Vous ne pouvez pas modifier un nom de colonne par ligne d'un jeu de résultats. C'est fondamental pour les bases de données relationnelles. Les noms des colonnes font partie de la table "en-tête" et un nom s'applique à la colonne en-dessous pour toutes les lignes.


Re comment: OK, peut-être l'OP Americus signifie que le résultat est connu pour être exactement une ligne. Cependant, SQL n'a pas de syntaxe pour prendre en charge un alias de colonne dynamique. Les alias de colonne doivent être constants dans une requête.

Même le SQL dynamique ne vous aide pas, car vous devez exécuter la requête deux fois. Une fois pour obtenir la valeur, et une seconde fois pour réexécuter la requête avec un alias de colonne différent.

+0

Je pense qu'Americus suppose qu'une seule ligne est retournée et que le nom de l'en-tête change en fonction du jeu de résultats. – northpole

+0

C'est à peu près ce que j'attendais. Merci! – Americus

1

Vous aurez besoin quelque chose de similaire à ceci:

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

Il n'y a aucune raison de changer le nom de la colonne dynamique - il est analogue au nom d'une variable dans le code de procédure - il est juste une étiquette que vous pourriez référez-vous à plus tard dans votre code, donc vous ne voulez pas qu'il change à l'exécution.

Je suppose que ce que vous recherchez est un moyen de formater la sortie (par exemple pour imprimer dans un rapport) différemment selon les données. Dans ce cas, je générer le texte du titre comme une colonne séparée dans la requête, .: par exemple

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

Ensuite, la procédure d'appel prendrait les valeurs renvoyées pour mydata et myHeader et les mettre en forme pour la sortie au besoin.

2

La « bonne » façon de le faire dans SQL est d'avoir les deux colonnes, et ont la colonne qui ne convient pas être NULL, tels que:

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; 
Questions connexes