使用Oracle子选择替换CASE语句

时间:2009-07-16 00:48:33

标签: sql oracle case subquery

Hy guys,

任何人都可以帮我在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,只是想将A.column1值替换为B.column_b_1_descr中的描述值,因为它们是更容易阅读。 我将不胜感激任何反馈。 感谢

1 个答案:

答案 0 :(得分: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;

不需要where子句,因为内连接会自动排除具有空值或无匹配的行。