【问题标题】:NULLIF of FINAL SUM Doubled when using MATCH_RECOGNIZE使用 MATCH_RECOGNIZE 时 FINAL SUM 的 NULLIF 翻倍
【发布时间】:2020-05-01 12:03:46
【问题描述】:

当我运行以下代码时,我希望 b1b2 相等,但是,b2 是两倍。难道我做错了什么?这是数据库中的错误吗?我们正在运行 Oracle 12c (12.2.0.1.0)

WITH TBL AS
  (
  SELECT 1 a, 1 b FROM DUAL UNION ALL
  SELECT 1 a, 2 b FROM DUAL UNION ALL
  SELECT 1 a, 3 b FROM DUAL UNION ALL
  SELECT 1 a, 4 b FROM DUAL
  )
SELECT
  *
FROM
  TBL
MATCH_RECOGNIZE
  (
  PARTITION BY
    a
  ORDER BY
    b
  MEASURES
    FINAL SUM(b) b1,
    NULLIF(FINAL SUM(b), 0) b2
  ALL ROWS PER MATCH WITH UNMATCHED ROWS
  AFTER MATCH SKIP PAST LAST ROW
  PATTERN
    (C*)
  DEFINE
    C AS B > 0
  ) mr

结果:

| A | B | B1 | B2 |
|---|---|----|----|
| 1 | 1 | 10 | 20 |
| 1 | 2 | 10 | 20 |
| 1 | 3 | 10 | 20 |
| 1 | 4 | 10 | 20 |

【问题讨论】:

    标签: oracle oracle12c nullif match-recognize


    【解决方案1】:

    问题似乎出在NULLIF,当我将它转换成它的逻辑等价物并且它工作正常CASE WHEN expr1 = expr 2 THEN NULL ELSE expr1 END

    WITH TBL AS
          (
          SELECT 1 a, 1 b FROM DUAL UNION ALL
          SELECT 1 a, 2 b FROM DUAL UNION ALL
          SELECT 1 a, 3 b FROM DUAL UNION ALL
          SELECT 1 a, 4 b FROM DUAL
          )
        SELECT
          *
        FROM
          TBL
        MATCH_RECOGNIZE
          (
          PARTITION BY
            a
          ORDER BY
            b
          MEASURES
            FINAL SUM(b) b1,
           CASE WHEN FINAL SUM(b)=0 THEN NULL ELSE FINAL SUM(b) END b2
          ALL ROWS PER MATCH WITH UNMATCHED ROWS
          AFTER MATCH SKIP PAST LAST ROW
          PATTERN
            (C*)
          DEFINE
            C AS B > 0
          ) mr 
    

    结果

        | A | B | B1 | B2 |
        |---|---|----|----|
        | 1 | 1 | 10 | 10 |
        | 1 | 2 | 10 | 10 |
        | 1 | 3 | 10 | 10 |
        | 1 | 4 | 10 | 10 |
    

    【讨论】:

    • 同意,我认为NULLIFMATCH_RECOGNIZE 结合时存在错误。
    • 有没有办法向Oracle提交错误?
    • 您需要让您的 DBA 在 oracle@support.oracle.com 中提交支持票
    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    相关资源
    最近更新 更多