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 对<>
或!=
很满意,任君挑选:)
谢谢。我需要满足另一种情况,因此我必须扩展我在下面添加为答案的查询。以上是关于Oracle where 子句中的 case 表达式的主要内容,如果未能解决你的问题,请参考以下文章
Oracle SQL 不同的 where 子句与 case when