我有一个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';
答案 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语句中将字符串标记为不同的字段。