仅在非空列上的 case 语句
Posted
技术标签:
【中文标题】仅在非空列上的 case 语句【英文标题】:case statement only on column that is not null 【发布时间】:2013-09-26 20:09:00 【问题描述】:我正在编写一个查询,根据生日和当前日期搜索 18 岁以上的人。在某些情况下,一个人在数据库中没有出生日期。对于这些人,我只想将他们包含在我的查询中,而不是对他们执行 where 子句。这可能吗?这是一个 db2 数据库
select *
from people i
where case when coalesce(i.birth_date,'') != '' then (i.birth_date < (SELECT CURRENT_DATE - 18 years from datetoday)) else '' end
上面的查询是我尝试过的,但抛出了一个错误,我不确定它是否是正确的格式。或者,如果我尝试做的事情是可能的。
【问题讨论】:
【参考方案1】:不要使用CASE
,而是使用OR
:
select *
from people i
where (coalesce(i.birth_date) != '' AND (i.birth_date < (SELECT CURRENT_DATE - 18 years from datetoday)))
OR coalesce(i.birth_date) = ''
您不能返回带有CASE
语句的表达式。
【讨论】:
就像一般的 FYI 一样:case 只能用于 SQL 查询的 select 部分。在 where 子句中只能使用 or。 @PeterSchuetze 我不了解 db2,但您当然可以在某些数据库的WHERE
子句中使用 CASE
。
@GoatCO:我用谷歌搜索了一下,你说得对,我很抱歉。它甚至在 db2 中被接受。但是,case 表达式将代替一个值(例如,如 '(case when ... then ... else ...) > 15')。所以这似乎是 BS123 查询的问题。【参考方案2】:
试试这个:
select *
from people i
where i.birth_date IS NULL OR i.birth_date < (SELECT CURRENT_DATE - 18 years from datetoday)
您可以检查birth_date 是否为空或是否超过18 岁。
【讨论】:
以上是关于仅在非空列上的 case 语句的主要内容,如果未能解决你的问题,请参考以下文章