【问题标题】:how can I use subquery in CASE THEN?如何在 CASE THEN 中使用子查询?
【发布时间】:2021-05-12 16:19:38
【问题描述】:

我尝试在 CASE THEN 中使用子查询,如下所示。(我在 ORACLE 中写下了代码)

WITH SAMPLE AS (

SELECT 1 AS VALUE_, 
       '20191230' AS DATE_
FROM DUAL

UNION

SELECT 2 AS VALUE_, 
       '20201230' AS DATE_
FROM DUAL)

SELECT VALUE_,
       DATE_,
       CASE
           WHEN TO_CHAR(ADD_MONTHS(DATE, -12), 'YYYYMMDD') IN (SELECT DATE_ FROM SAMPLE)
                THEN (SELECT VALUE_ FROM SAMPLE WHERE DATE_ = TO_CHAR(ADD_MONTHS(DATE, -12), 
                     'YYYYMMDD'))
           ELSE NULL
       END AS ONE_YEAR_AGO_VALUE_
FROM SAMPLE;

我希望得到一个新列 (ONE_YEAR_AGO_VALUE_),第一行为 NULL,第二行为 1。

但是,结果与我预期的不同。

结果有一个“ONE_YEAR_AGO_VALUE_”,第一行为 NULL,第二行为 NULL。

我想让第二行有 1 个。

如果您让我知道我的代码中的错误之处,我真的很感激。

谢谢。

【问题讨论】:

  • 您的代码在很多方面都没有意义。例如,当 DATE_ 是字符串时,您将其视为日期。

标签: sql database oracle subquery


【解决方案1】:

当我修复您的查询以正确使用日期时,它会生成一行 NULL 和一行 1

WITH SAMPLE AS (
      SELECT 1 AS VALUE_, DATE '2019-12-30' AS DATE_
      FROM DUAL
      UNION ALL
      SELECT 2 AS VALUE_, DATE '2020-12-30' AS DATE_
      FROM DUAL
     ) 
SELECT S.VALUE_, S.DATE_,
       (CASE WHEN ADD_MONTHS(S.DATE_, -12) IN (SELECT S2.DATE_ FROM SAMPLE S2)
             THEN (SELECT S2.VALUE_ FROM SAMPLE S2 WHERE S2.DATE_ = ADD_MONTHS(S.DATE_, -12))
       END) AS ONE_YEAR_AGO_VALUE_
FROM SAMPLE S;

您的代码也过于复杂。您不需要 CASE 表达式,您可以直接将其用于值。 Here 是一个 dbfiddle。

【讨论】:

  • 非常感谢您的回答。我没有考虑您提供的简单代码。谢谢你。我还有一个问题。在子查询中,代码“WHERE S2.DATE_ = ADD_MONTHS(S.DATE_, -12)”是否将该子查询设为“相关子查询”?我了解到,如果在 WHERE 中比较来自不同表的两列,它会使子查询成为相关子查询。对吗?
  • @WooseokChoi 。 . .通常,您应该限定查询中的 all 列引用。在相关子查询中尤其如此。
猜你喜欢
  • 1970-01-01
  • 2021-05-15
  • 2016-04-10
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
相关资源
最近更新 更多