【问题标题】:case statement only on column that is not null仅在非空列上的 case 语句
【发布时间】: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

上面的查询是我尝试过的,但抛出了一个错误,我不确定它是否是正确的格式。或者,如果我尝试做的事情是可能的。

【问题讨论】:

    标签: sql db2 case where


    【解决方案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 岁。

    【讨论】:

      猜你喜欢
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多