如何从Where条件中的CASE子句返回多个值

时间:2015-07-06 09:55:39

标签: sql oracle case

我有一个编码,我需要在where子句中使用多个参数 使用条件运算符。 我写了以下查询,在这种情况下我不能使用in clasue。 请指导我如何从case子句中返回多个参数。

select * from cardimport
where
STATUS = CASE
WHEN STATUS = ''
THEN 'F'
ELSE STATUS
END

null中的状态时,我想要返回'F''V'。现在它只返回'F'

EDITED

select *
from CARDIMPORT
where STATUS =   CASE
WHEN $P{status} = ''
THEN 'E'
ELSE $P{status}
END

当STATUS为空时,我想显示所有状态的记录,即'E''I''A'

6 个答案:

答案 0 :(得分:2)

我认为您不需要CASE,而是需要 NVL NVL2

如果我理解你的要求,当状态值为NULL时需要一个特定的行,否则当不为null时返回所有的行。

例如,在下面的EMP表示例中。如果参数值为NULL,我只希望在comm300 = not null的那一行返回所有行。

<强> NULL

SQL> VAR a NUMBER;
SQL> EXEC :a := NULL

PL/SQL procedure successfully completed.

SQL> SELECT empno, comm FROM emp WHERE NVL(comm, 9999) = NVL2(:a, NVL(comm, 9999), 300);

     EMPNO       COMM
---------- ----------
      7499        300

非空

SQL> EXEC :a :=1400

PL/SQL procedure successfully completed.

SQL> SELECT empno, comm FROM emp WHERE NVL(comm, 9999) = NVL2(:a, NVL(comm, 9999), 300);

     EMPNO       COMM
---------- ----------
      7369
      7499        300
      7521        500
      7566
      7654       1400
      7698
      7782
      7788
      7839
      7844
      7876
      7900
      7902
      7934

14 rows selected.

SQL>

以上使用以下逻辑:

  • 如果传递的值为NULL,则返回COMM = 300
  • 否则,如果传递的值为NOT NULL,则返回所有行。

答案 1 :(得分:1)

你应该尝试以下,

Declare @status nvarchar(50) = 'XXXX'
select 
    * 
from cardimport
where
1 = case when isnull(@status,'') = '' then 1 
    else
        case when status = @status then 1 else 0 end
    end 

当status为null并且status不为null时,它将为您提供所有行,然后仅为您提供匹配的数据。

答案 2 :(得分:1)

DECLARE @active VARCHAR(10) = 0
SELECT * FROM department 
WHERE  `enter code here`
(
    (1 = CASE WHEN @active = 0 THEN 1 ELSE 0 END and (active is null or active = 0))
 or (1 = CASE WHEN @active = 1 THEN 1 ELSE 0 END and active = 1)
)

答案 3 :(得分:0)

可以从案例中返回集合。 KU $ _VCNT是预定义的集合(KU$_VCNT is table of varchar2(4000))。

with c_table as (select null status from dual
 union all 
select  'A' status from dual
union all 
select  'B' status from dual
)
select status,case when status is null then KU$_VCNT('NULL1','NULL2') else KU$_VCNT('A','B','C','D') end  from c_table
where status member of 
case when status is null then KU$_VCNT('NULL1','NULL1') else KU$_VCNT('A','B','C','D')  end 

答案 4 :(得分:0)

select * from cardimport t
where
t.STATUS in 
case  when t.STATUS is null then 
(select 'F' from dual union select 'V' from dual ) else t.STATUS end

这种情况是必需的。但是我发现你的理解可能有些不对劲,因为你试图将空状态与'F'/'V'匹配,后者永远不会变成真实状态

如果您希望在返回多个记录的情况下使用case子句,则上面只是条件

答案 5 :(得分:0)

我不确定在ORACLE中执行此操作,但可以通过以下方法在Microsoft SQL SERVER中实现相同的目标:

DECLARE @Status VARCHAR(1)=''

SELECT * from cardimport
where
STATUS IN(SELECT Status FROM cardimport WHERE (@Status='' AND status IN('E','I','A')) OR (@Status<>'' AND status=status))