如何将oracle中的解码功能转换为标准大查询

Posted

技术标签:

【中文标题】如何将oracle中的解码功能转换为标准大查询【英文标题】:How to convert decode function in oracle to standard big query 【发布时间】:2019-08-16 12:09:26 【问题描述】:

有人可以帮我将以下 oracle 代码转换为标准大查询

SELECT
  Table1.BIC_ZC2ISBN10,
  sum ( decode(Table1.BIC_ZC2DCINDC,'H', (decode(Table1.BIC_ZC2MOVTYP,
       'Z03',Table1.BIC_ZK2CLABS2,
       'Z35',Table1.BIC_ZK2CLABS2,
       'Z64',Table1.BIC_ZK2CLABS2,
       'Z77',Table1.BIC_ZK2CLABS2,
        0)),0)   -  decode(Table1.BIC_ZC2DCINDC,'S', 
        (decode(BOADMIN.BIC_GM_AP2OINVS300_BO_VW.BIC_ZC2MOVTYP,
        'Z04',Table1.BIC_ZK2CLABS2,
        'Z36',Table1.BIC_ZK2CLABS2,
        'Z65',Table1.BIC_ZK2CLABS2,
         'Z78',Table1.BIC_ZK2CLABS2,
         0)),0) )
FROM
  Table1
GROUP BY
  Table1.BIC_ZC2ISBN10

我是大查询的新手,我对“解码”功能一无所知。

谢谢

【问题讨论】:

在文档上查看解码的含义:docs.oracle.com/database/121/SQLRF/functions057.htm#SQLRF00631 您的查询在SELECT 中有两个表,但在FROM 中只有一个。它不会在任何数据库上运行(除非看起来像表引用实际上是嵌套表/结构引用)。 【参考方案1】:

可以使用 CASE 语句代替 DECODE

CASE expr WHEN value THEN result [WHEN ...] [ELSE else_result] END

【讨论】:

会转换成大查询吗? CASE 语句在 bigquery 中可用...见 ***.com/questions/11647201/… 很好,我不知道.. 谢谢。学会了。赞成答案...干杯!!【参考方案2】:

正如@heregoes 建议case when 可用于大查询,您可以使用以下查询。

SELECT
    TABLE1.BIC_ZC2ISBN10,
    SUM(CASE
        WHEN TABLE1.BIC_ZC2DCINDC = 'H' THEN CASE
            WHEN TABLE1.BIC_ZC2MOVTYP IN(
                'Z03', 'Z35', 'Z64', 'Z77'
            ) THEN TABLE1.BIC_ZK2CLABS2
            ELSE 0
        END
        ELSE 0
    END - CASE
        WHEN TABLE1.BIC_ZC2DCINDC = 'S'  THEN CASE
            WHEN BOADMIN.BIC_GM_AP2OINVS300_BO_VW.BIC_ZC2MOVTYP IN (
                'Z04',
                'Z36',
                'Z65',
                'Z78'
            ) THEN TABLE1.BIC_ZK2CLABS2
            ELSE 0
        END
        ELSE 0
    END
)
FROM TABLE1 
GROUP BY TABLE1.BIC_ZC2ISBN10;

干杯!!

【讨论】:

【参考方案3】:

您可以使用条件聚合来做到这一点。但是,您不需要嵌套的 CASE 表达式。事实上,您甚至不需要 多个 CASE 表达式。一个就够了:

SELECT t1.BIC_ZC2ISBN10,
       SUM(CASE WHEN t1.BIC_ZC2DCINDC = 'H' AND
                     t1.BIC_ZC2MOVTYP IN ('Z03', 'Z35', 'Z64', 'Z77')
                THEN t1.BIC_ZK2CLABS2
                WHEN t1.BIC_ZC2DCINDC = 'S' AND 
                     bg.BIC_ZC2MOVTYP IN ('Z04', 'Z36', 'Z65', 'Z78')
                THEN - t1.BIC_ZK2CLABS2
                ELSE 0
           END)
. . .

请注意,BOADMIN.BIC_GM_AP2OINVS300_BO_VW 未在您的 FROM 子句中定义。我为它定义了一个表别名bg,为第一个表定义了t1

【讨论】:

以上是关于如何将oracle中的解码功能转换为标准大查询的主要内容,如果未能解决你的问题,请参考以下文章

oracle 10g如何将列转换为行

如何将字符串日期列转换为 Google 大查询中的日期列?

如何将具有排名值的列转换为oracle中的行

如何将 MySQL 查询转换为等效的 Oracle sql 查询

将 Oracle 查询中的 keep dense_rank 转换为 postgres

只是想知道如何使用合并语句将下面的查询转换为 oracle 查询?