使用Oracle中的Select语句中的Case返回多个列

时间:2009-03-31 08:58:02

标签: oracle

我有一个sceanrio,我需要根据主select语句中的条件从不同的子查询中检索值。我试图使用Case,但问题是Case不支持多列。是否有任何解决方法,或者是否有其他方法来实现这一点。

我在简化查询中的方案

select col1,col2,
case when col3='E01089001' then 
        (select 1,3 from dual)
    else
        (select 2,4 from dual)
end
from Table1
where col1='A0529';

5 个答案:

答案 0 :(得分:7)

这是编写它的另一种方式,可能会解决有关访问第二个表的次数超过必要的问题。

select col1,col2,
case when col3='E01089001' then 1 else 2 end,
case when col3='E01089001' then 3 else 4 end
end
from Table1, dual
where col1='A0529';

您的示例使用了一个明显简化的子查询,因此这个版本看起来很傻;没有理由加入DUAL。但在您的真实查询中,您可能会有一个像SELECT a, b FROM otherTable WHERE someCondition这样的子查询。因此,您可能希望使用实际的列名而不是数字文字和实际的表名而不是dual,并将子查询条件移动到最终的WHERE子句中。

答案 1 :(得分:2)

快速而肮脏的解决方案。

select dummy,substr(c,1,instr(c,',')-1) c1,substr(c,instr(c,',')+1) c2
from (
select dummy,
case when dummy='X' then 
        (select 1||','||3 from dual)
end c
from (select * from dual)
)

答案 2 :(得分:1)

如果每个案例只允许一列,那么您可能需要两种情况:

select col1,col2,
case when col3='E01089001' then 
    (select 1 from dual)
else
    (select 2 from dual)
end,
case when col3='E01089001' then 
    (select 3 from dual)
else
    (select 4 from dual)
end
from Table1
where col1='A0529';

我希望我不需要告诉你,当数据库表变大时,这种东西不能很好地扩展。

答案 3 :(得分:1)

Case支持条件检查中的多个列

CASE WHEN A=X AND B=Y THEN ... END

您在示例中尝试执行的操作是将表(2列)返回到需要一列的结果集:col1,col2,(col3,col4)。

您需要单独归还:col1,col2,col3,col4

select
col1,
col2,
case when col3='E01089001' then (select 1 from dual) else (select 3 from dual) end,
case when col3='E01089001' then (select 2 from dual) else (select 4 from dual) end
from Table1 where col1='A0529';

答案 4 :(得分:0)

对我来说最好的方法是使用REGEXP_REPLACE。从case语句返回一个字符串,并在外部查询块select语句中将字符串标记为不同的字段。