我如何在 CASE THEN 中使用子查询?

how can I use subquery in CASE THEN?

我尝试在 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。

如果您让我知道我的代码中有什么错误,我将不胜感激。

谢谢。

当我修复您的查询以正确使用日期时,它会生成一行 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 是一个 db<>fiddle.