仅在非空列上的 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 语句的主要内容,如果未能解决你的问题,请参考以下文章

使用 case 语句计算非空列的数量

ALTER TABLE,在非空列中设置空,PostgreSQL 9.1

左连接 ON 非空列不能选择非空列

如何根据另一列的值创建空列或非空列?

在一列中获取火花数据帧的所有非空列

Scala DataFrame,将非空列的值复制到新列中