使用 Oracle 子选择替换 CASE 语句
Posted
技术标签:
【中文标题】使用 Oracle 子选择替换 CASE 语句【英文标题】:Using a Oracle subselect to replace a CASE statement 【发布时间】:2009-07-16 00:48:33 【问题描述】:大家好,
谁能帮我处理 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 值,因为它们是更容易阅读。 我将不胜感激任何反馈。 谢谢
【问题讨论】:
为了澄清,当column1为'A'时,您希望输出行中“column1”字段的字符串'aaa',而不是列中的值称为' aaa',对吧? 【参考方案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 子句,因为内连接会自动排除具有空值或不匹配的行。
【讨论】:
如果你想保留 'bad' 值,将其转换为 OUTER JOIN 并将 SELECT 的第一部分更改为 "SELECT Coalesce(t2.value, 'bad') as COLUMN1, .. .以上是关于使用 Oracle 子选择替换 CASE 语句的主要内容,如果未能解决你的问题,请参考以下文章
在 oracle 中的 case 或 decode 语句中使用 sum
如何从oracle sql中的选择计数中对rownum使用case语句?
不使用 EXISTS 嵌套 case 语句引入子查询时,选择列表中只能指定一个表达式