2009-07-16 53 views
0

Hy guys,使用Oracle子查询替换CASE语句

任何人都可以帮我一个Oracle数据库10g的子查询吗?我需要提取第一个表中列的值作为第二个表中另一列的值。 我目前使用的这种说法:

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 <> ' ' 

这不是一个优雅的方法,所以我试图像下面使用子查询从CATEGORY_TABLE B:

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) 

所以,我不能得到任何结果通过使用子查询并且不希望在许多条件下继续使用CASE,只想用B.column_b_1_descr中的描述值替换A.column1值,因为它们更易于阅读。 我会很感激任何反馈。 感谢

+0

为了澄清,当column1为'A'时,您希望输出行中“column1”字段的字符串'aaa',而不是列*中的值*'aaa',对不对? – 2009-07-16 01:12:10

回答

1

除非我误解你的问题......

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 

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

将在不需要条款,因为内连接自动排除空值或行无匹配。

+2

如果你想保留'坏'值,把它变成一个OUTER JOIN,并将SELECT的第一部分改为“SELECT Coalesce(t2.value,'bad'),如COLUMN1,... – 2009-07-16 04:56:18