【问题标题】:How to Return Multiple Values from CASE clause in Where Condition如何从 Where 条件中的 CASE 子句返回多个值
【发布时间】:2015-09-23 10:03:31
【问题描述】:

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

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

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

已编辑

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

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

【问题讨论】:

  • 这里的条件应该是错误的 status =status 显示所有不为空的记录。为什么需要两个值
  • @Kirman88 - 向我们展示输入和所需的输出。
  • 您能否显示示例表数据并显示您想要的结果。您应该使用“IS NULL”来检查 null,而不是 =''。 STATUS 是表中的一列吗?
  • @Kirmani88 参数在哪里?您的查询根本不涉及任何参数。
  • @MukeshKalgude 啊!我没有看到OP两边都有列名,我认为它是运算符左侧的参数。

标签: sql oracle case


【解决方案1】:

可以从案例中返回集合。 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 

【讨论】:

    【解决方案2】:
    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
    

    这种条件是必需的。但我发现您的理解可能有问题,因为您尝试将 null 状态与 'F'/'V' 匹配,这永远不会变成真实条件

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

    【讨论】:

    • WHERE 1 =1 始终为 TRUE。它将返回所有行。 statusNULL 的行将被忽略,因为您无法将 NULL 与任何值进行比较。
    • t.Status 附近的 IN 语句未按预期工作
    【解决方案3】:

    我认为您不需要 CASE,而是需要 NVLNVL2

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

    例如,在下面的示例中来自EMP 表。如果参数值为NULL,我只希望comm = 300 的那一行,否则当not 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所在的行。
    • 否则,如果传递的值不是 NULL,则返回所有行。

    【讨论】:

    • OP不清楚他使用的是Oracle还是MySQL——后者没有NVL/NVL2功能。
    • @PaulF OP 已标记Oracle
    • 在我发表评论时,OP 仍然将 MySQL 作为标签 - 那是将近 6 年前的事了。
    • @PaulF 我同意,接受的答案也与 Oracle 无关。奇怪!
    【解决方案4】:

    你应该尝试关注,

    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 
    

    当状态为空时,它会给你所有的行,当状态不为空时,它只会给你匹配的数据。

    【讨论】:

    • 谢谢 :) \这个查询在没有提供数据时工作正常,但是当我输入一些数据时它返回空结果集
    • 您想要所有状态不为空的数据和带有'F'和'V'的空状态?
    • 看到我已经更新了答案,实际上当状态不为空时我没有得到你想要的结果!!!
    • 是的,当Status 为空时,我想显示所有Status 的数据,当用户指定某个状态时,我只想显示那个特定状态的数据。
    • 编辑后的查询为 NullNot Null 返回相同的结果集
    【解决方案5】:

    我不确定在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))
    

    【讨论】:

      【解决方案6】:
      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)
      )
      

      【讨论】:

        猜你喜欢
        • 2018-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-29
        • 2012-04-22
        • 1970-01-01
        • 2019-02-09
        • 2011-08-21
        相关资源
        最近更新 更多