在Oracle中使用CASE表达式

在Oracle中使用CASE表达式,oracle,Oracle,我有一个场景,如果来自用户的提示(1或0)=1,那么它必须从dual返回值,否则它必须返回其他表数据 下面是我尝试过的查询:但出现错误:值太多 with CTE_ACC_FNKEYS AS ( (select CASE WHEN 1=1 --@Prompt('Users:','A','Customer\Customer Account\Source System Code',Mono,Free,Not_Persistent,,User:3) is not null then (select

我有一个场景,如果来自用户的提示(1或0)=1,那么它必须从dual返回值,否则它必须返回其他表数据

下面是我尝试过的查询:但出现错误:值太多

with CTE_ACC_FNKEYS AS (
(select 
CASE WHEN 1=1
--@Prompt('Users:','A','Customer\Customer Account\Source System Code',Mono,Free,Not_Persistent,,User:3) is not null
then (select  e,f,g,h  from dual)
else
   (
   SELECT
      a,b,c,d
   FROM
       TABLE ( BI_RPT.GET_ACCOUNTDETAILS( 'ON897451','[SA].[0]') ))

end as b  from dual      
))

select * from CTE_ACC_FNKEYS

您只能选择一个@Ankit Bajpai注释的值。像这样:

with CTE_ACC_FNKEYS AS (
(select 
CASE WHEN 1=1
then (select '0' from dual)
else
   (
   SELECT
      'a'||'b'||'c'||'d'
   FROM
      dual)

end as b  from dual      
))

select * from CTE_ACC_FNKEYS;

如果你需要其他的东西,请详细解释,并给出一些你希望得到的结果示例。干杯

您的代码和解释看起来很混乱,但我认为您试图根据用户输入返回不同的结果。毫无疑问,有一个很好的理由可以解释为什么这个逻辑不能被合并到BI_RPT.GET_ACCOUNTDETAILS()中,但是用CASE解决它不是正确的方法

一种解决方案是编写一个包装器函数。但是,最接近您当前代码的解决方案是一个联盟

select a, b , c, d
from   TABLE ( BI_RPT.GET_ACCOUNTDETAILS( 'ON897451','[SA].[0]') ))
where &&p_user_input = 0
union
select 0, 0, 0 , 0 -- or whatever is represented by e, f, g, h
from  dual
where &&p_user_input != 0

Case语句期望从THEN返回相同的数据类型,否则两者都返回。如果列a、b、c、d为varchar类型,请将所有0转换为字符。这可能是您的解决方案。我已经尝试了,但仍然得到错误a、b、c、d列的数据类型分别是什么。基本点是,您不能使用case语句返回超过1个值。这个语法不正确。“我有一个场景,如果1=1,那么…”-但是
1=1
总是正确的。我认为你在这里对代码进行了过度修改。我们只知道你告诉我们你的情况。如果您告诉我们的内容不完整、不准确或不连贯,我们将无法帮助您。