Oracle where 子句中的 case 表达式

Posted

技术标签:

【中文标题】Oracle where 子句中的 case 表达式【英文标题】:Case expression in Oracle where clause 【发布时间】:2011-03-01 08:59:39 【问题描述】:

我有一个标准搜索子句,我在某些过滤器上选择记录,例如描述和状态,状态值是 101 到 110。状态可能为空,如果是这样,我返回任何状态的记录。但是,我现在有一个新状态,当没有特定状态时,它必须从返回的记录中排除,并且只有在特别选择时才返回。因此,基于特定状态的搜索仅返回该状态,没有特定状态的搜索返回除新状态之外的所有状态。原来的where子句是:

where Upper(cfs.CAE_SEC_ID) = Upper(NVL(p_cae_sec_id_n,cfs.CAE_SEC_ID)) 
and Upper(SEC_CODE) like '%' || Upper(NVL(p_fm_sec_code_c,SEC_CODE)) || '%' 
and APPR_STATUS = NVL(p_appr_status, APPR_STATUS)
order by appr_status DESC, cae_sec_id 

我现在想做的是这样的:

where Upper(cfs.CAE_SEC_ID) = Upper(NVL(p_cae_sec_id_n,cfs.CAE_SEC_ID)) 
and Upper(SEC_CODE) like '%' || Upper(NVL(p_fm_sec_code_c,SEC_CODE)) || '%' 
and APPR_STATUS =
  (CASE WHEN p_appr_status is null THEN --return all statuses except 110
  WHEN p_appr_status is not null THEN (p_appr_status)
  END)
order by appr_status DESC, cae_sec_id 

在 where 子句中是否可以使用 case 表达式?


@Damien 提供了答案,因此感谢他。还有另一种情况我需要满足 - 同一个过程返回单个记录以及多个记录。如果有人搜索状态为忽略的单个记录(p_cae_sec_id_n 不为空),则该记录已从上面排除,因此我将其添加到下面:

and APPR_STATUS = 
  (CASE WHEN p_appr_status is null and APPR_STATUS != 110 THEN APPR_STATUS
  WHEN (p_appr_status is null and p_cae_sec_id_n is not null) THEN APPR_STATUS
  WHEN p_appr_status is not null THEN (p_appr_status)
  END)

【问题讨论】:

我认为您应该添加一个“else”子句以在其他情况下返回您想要的内容,即使它为空。否则,如果 p_appr_status 为 null 且 appr_status = 110,您可能会得到奇怪的结果。 【参考方案1】:

我更像是一个 SQL Server 人,但以下应该可以解决问题(假设 Oracle 不等于 <>,而不是 !=):

 (CASE WHEN p_appr_status is null and APPR_STATUS<>101 THEN APPR_STATUS
  WHEN p_appr_status is not null THEN (p_appr_status)
  END)

【讨论】:

Oracle 对&lt;&gt;!= 很满意,任君挑选:) 谢谢。我需要满足另一种情况,因此我必须扩展我在下面添加为答案的查询。

以上是关于Oracle where 子句中的 case 表达式的主要内容,如果未能解决你的问题,请参考以下文章

Where 子句 TSQL 中的 case 表达式

where 子句 oracle 中的 case 语句

Oracle:在 Where 子句中使用 Case 语句

Oracle SQL 不同的 where 子句与 case when

WHERE子句中的SQL Server CASE表达式以检查NULL值

Oracle SQL的Where子句中如何写case语句?