【问题标题】:Subquery as CASE WHEN condition子查询作为 CASE WHEN 条件
【发布时间】:2021-09-07 07:22:36
【问题描述】:

以下查询,AS PQ_COUNT 发生语法错误

SELECT CASE WHEN
     RESULTS LIKE '%PQ - Duplicate%' AND 
     (SELECT COUNT(*) FROM MY_TABLE WHERE ID = '998877'AND FINAL_RESULTS='FL_57') AS PQ_COUNT >= 1 
    THEN 'PQ count = '|| PQ_COUNT 
ELSE RESULTS END AS RESULTS 

如果我将AS PQ_COUNT 移动到选择查询中,

(SELECT COUNT(*) AS PQ_COUNT FROM MY_TABLE WHERE ID = '998877'AND FINAL_RESULTS='FL_57') >= 1

THEN 块中 PQ_COUNT 的引用成为无效标识符 (ORA-00904)

将子查询作为 CASE WHEN 条件处理时可能会出现什么问题?

【问题讨论】:

    标签: oracle subquery case ora-00904


    【解决方案1】:

    一种选择是使用子查询(或 CTE,如我的示例)来计算满足条件的行数,然后 - 因为它只包含一行 - 将其交叉连接到 my_table。像这样的:

    SQL> WITH
      2     my_table (id, final_results, results) AS
      3     -- sample data
      4        (SELECT '998877', 'FL_57', 'PQ - Duplicate' FROM DUAL),
      5     cnt AS
      6     -- calculate COUNT first ...
      7        (SELECT COUNT (*) pq_count               --> pq_count
      8           FROM MY_TABLE
      9          WHERE     ID = '998877'
     10                AND FINAL_RESULTS = 'FL_57')
     11  -- ... then re-use it in "main" query
     12  SELECT CASE
     13            WHEN     a.results LIKE '%PQ - Duplicate%'
     14                 AND b.pq_count >= 1            --> reused here
     15            THEN
     16               'PQ count = ' || b.PQ_COUNT      --> and here
     17            ELSE
     18               a.results
     19         END AS results
     20    FROM my_table a CROSS JOIN cnt b;
    
    RESULTS
    ---------------------------------------------------
    PQ count = 1
    
    SQL>
    

    【讨论】:

      【解决方案2】:

      您不能在创建别名的子查询中引用别名;您需要嵌套子查询(或使用子查询因式分解子句;也称为 CTE 或 WITH 子句)并在外部引用它:

      SELECT CASE
             WHEN results LIKE '%PQ - Duplicate%'
             AND  pq_count >= 1 
             THEN 'PQ count = '|| pq_count
             ELSE results
             END AS RESULTS
      FROM   (
        SELECT results,
               ( SELECT COUNT(*)
                 FROM   MY_TABLE
                 WHERE  ID = '998877'
                 AND    FINAL_RESULTS='FL_57'
               ) AS pq_count
        FROM   your_table
      );
      

      【讨论】:

        猜你喜欢
        • 2021-08-04
        • 2022-12-15
        • 2020-08-08
        • 2017-05-30
        • 2021-12-22
        • 1970-01-01
        • 2016-02-23
        • 2014-11-29
        • 2017-08-15
        相关资源
        最近更新 更多