[英]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.