2009-02-10 29 views
1

J'ai une table temporaire qui contient des valeurs entières numériques dans une colonne. Je souhaite soit remplacer les valeurs entières par des valeurs de caractères en fonction de certains critères, soit ajouter une autre colonne de type caractère qui insère automatiquement les valeurs dans lui-même en fonction de certains critères.SQL - Informix - Modification du type de données d'une colonne de numérique à caractère

Si x < = 1, passez à « SP » ou faire nouvelle colonne et stocker « SP » dans cette ligne
Si x> 1, le changement de « FA » ou faire nouvelle colonne et stocker « FA » dans ce row

De même, les commandes alter ne sont pas autorisées sur les tables temporaires dans ma version d'Informix.

+0

Il aide à spécifier la version d'IDS - ou d'un autre serveur de base de données Informix - surtout si vous devez mentionner 'dans ma version'. –

+0

Je n'avais pas à le mentionner, je ne pense pas - comment puis-je obtenir la version? personne ne semble le savoir, et les manuels que nous avons sont périmés – CheeseConQueso

Répondre

0
SELECT   enrollsess.id, 
       enrollsess.yr, 
       "SP" sess 
FROM   enrollsess 
WHERE   enrollsess.yr_offset <= 1 
UNION 
SELECT   enrollsess.id, 
       enrollsess.yr, 
       "FA" sess 
FROM   enrollsess 
WHERE   enrollsess.yr_offset > 1 
INTO   TEMP enrollsess2 WITH NO LOG; 
+0

N'auriez-vous pas pu faire une déclaration CASE à la place? – avgbody

1

Vous avez raison, vous ne pouvez pas modifier une table temporaire. Ajout d'une colonne supplémentaire avec cette valeur dérivée peut être fait avec une déclaration CASE, à savoir:

SELECT enroll.ud, enroll.yr, (CASE 
    WHEN enrollsess.yr_offset <=1 THEN "FA" 
    ELSE "SP" END)::CHAR(2) AS sess, ... 

Le casting (les parenthèses et ::CHAR(2)) ne sont probablement pas nécessaire.

Si la logique peut être exprimée comme zéro/non nul (ce n'est pas clair dans votre exemple, si yr_offset peut être négatif), alors il est encore plus simple:

SELECT enroll.id, enroll.yr, 
    DECODE(enrollsess.yr_offset, 0, "FA", "SP")::CHAR(2) AS sess, ... 

More details on CASE syntax from the manual