2009-07-16 10 views
0

Hy gars,Utilisation d'un sous-élément Oracle pour remplacer une instruction CASE

quelqu'un peut-il s'il vous plaît m'aider avec une sous-requête dans la base de données Oracle 10g? J'ai besoin d'extraire les valeurs d'une colonne dans la première table en tant que valeur d'une autre colonne dans la deuxième table. J'utilise actuellement cette déclaration:

SELECT 
CASE WHEN A.column1 = 'A' THEN 'aaa' 
WHEN A.column1 = 'B' THEN 'bbb' 
....... 
WHEN A.column1 = 'X' THEN 'xxx' 
ELSE 'bad' END AS COLUMN1, A.* 
FROM TRANSACTION_TABLE A, CATEGORY_TABLE B 
WHERE A.column1 IS NOT NULL 
AND A.column1 <> ' ' 

Ce n'est pas une approche élégante, donc je suis en train d'utiliser un sous-sélection de CATEGORY_TABLE B comme ce qui suit:

SELECT A.column1, A.* 
FROM TRANSACTION_TABLE A, CATEGORY_TABLE B 
WHERE A.column1 IS NOT NULL 
AND A.column1 = B.column_b_1 
AND A.column1 <> ' ' 
AND A.column1 IN (SELECT B.column_b_1_descr FROM CATEGORY_TABLE B 
WHERE B.FIELDNAME = 'column1' AND A.column1 = B.column_b_1) 

Donc, je ne peux pas obtenir tout résultats en utilisant la sous-requête et ne veulent pas continuer à utiliser le CAS contre de nombreuses conditions, je veux juste remplacer les valeurs A.column1 avec les valeurs descriptives de B.column_b_1_descr, car ils sont plus faciles à lire. J'apprécierais tout commentaire. Merci

+0

Pour clarifier, vous voulez la chaîne 'aaa' pour le champ "column1" dans la ligne de sortie lorsque column1 est 'A', pas la valeur dans la colonne * appelée * 'aaa', non? –

Répondre

1

À moins que je suis malentendu votre question ...

CATEGORY_TABLE: 
    name | value 
    A  aaa 
    B  bbb 
    C  ccc 
... 


SELECT B.value AS COLUMN1, A.\* 
FROM TRANSACTION\_TABLE A, CATEGORY\_TABLE B 
WHERE A.column1 = B.name 

ou

SELECT t2.value as COLUMN1, t1.\* 
FROM TRANSACTION\_TABLE t1 
INNER JOIN CATEGORY\_TABLE t2 ON t1.column1 = t2.name; 

La clause where n'est pas nécessaire, car une jointure interne exclut automatiquement les lignes avec des valeurs nulles ou Pas de correspondance.

+2

Si vous voulez conserver les valeurs 'mauvaises', transformez-le en OUTER JOIN et changez la première partie de SELECT en 'SELECT Coalesce (t2.value,' bad ') en tant que COLUMN1, ... –

Questions connexes