我有一个编码,我需要在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'
答案 0 :(得分:2)
我认为您不需要CASE,而是需要 NVL 和 NVL2 。
如果我理解你的要求,当状态值为NULL时需要一个特定的行,否则当不为null时返回所有的行。
例如,在下面的EMP
表示例中。如果参数值为NULL
,我只希望在comm
时300
= 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>
以上使用以下逻辑:
COMM = 300
。答案 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))