如何将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中的解码功能转换为标准大查询的主要内容,如果未能解决你的问题,请参考以下文章
如何将 MySQL 查询转换为等效的 Oracle sql 查询