繁体   English   中英

在where子句中使用case表达式

[英]Using case expression inside where clause

我想要的是使用case语句或其他东西添加另一个条件。

我试过了:

SELECT * FROM tblcust 
WHERE cust_id = :p_cust_id 
CASE WHEN :p_first_name IS NOT NULL THEN
        AND first_name = :p_first_name
     WHEN :p_last_name IS NOT NULL THEN
        AND last_name = :p_last_name
     WHEN :p_first_name IS NULL AND :p_last_name IS NULL THEN
        NULL
     END;

您可能无法在此处使用CASE表达式来表示您的逻辑,但它当然可以重写:

SELECT * FROM tblcust 
WHERE
    cust_id = :p_cust_id AND
    ((:p_first_name IS NOT NULL AND first_name = :p_first_name) OR
     (:p_last_name IS NOT NULL AND last_name = :p_last_name)    OR
     (:p_first_name IS NULL AND :p_last_name IS NULL));

但这很难看,我们可以在这里使用COALESCE技巧使其变得更简单:

SELECT * FROM tblcust 
WHERE
    cust_id = :p_cust_id AND
    (COALESCE(:p_first_name, first_name || ' ') = first_name) OR
     COALESCE(:p_last_name, last_name || ' ') = last_name) OR
     (:p_first_name IS NULL AND :p_last_name IS NULL));

CASE表达式结构不正确的原因是因为当它只允许生成时,它会生成逻辑表达式 但是,在这种情况下,我们甚至不需要CASE表达式来处理您的逻辑。

我不确定你想要什么逻辑,但你可以在案例中做案例

With a 
as (
Select 1 id , NULL col1 union all
Select 2,10 union all
Select 3,Null
)
Select * from a
where id =1
OR  Case When col1 is not null then id=2
End

为了使这些“互斥”的条件使用括号加OR

SELECT * FROM tblcust 
WHERE (:p_first_name IS NOT NULL AND first_name = :p_first_name) 
OR (:p_last_name IS NOT NULL AND last_name = :p_last_name)
OR (:p_FIRST_name IS NULL AND :p_last_name IS NULL AND cust_id = :p_cust_id)

如果还有更多条件要添加,请小心包含“全部”括号中的所有集合

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM