首页 文章

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

提问于
浏览
1

我有一个编码,我需要使用条件运算符在 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为null时,我想显示所有状态的记录,即 'E''I''A'

5 回答

  • 2

    你应该试试,

    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时,它将为您提供所有行,然后仅为您提供匹配的数据 .

  • 1

    我认为你不需要CASE,而是需要 NVLNVL2 .

    如果我正确理解了您的要求,则在状态值为NULL时需要特定行,否则在不为null时则返回所有行 .

    例如,在下面的示例中,来自 EMP 表 . 如果参数值为 NULL ,那么当 not null 然后返回所有行时,我只期望 comm = 300 的那一行 .

    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
    

    NOT NULL

    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,则返回所有行 .

  • 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
    
  • 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子句,则上面只是条件

  • 0

    我不确定在_2729469中做到这一点,但通过以下方法可以在 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))
    

相关问题