我在Oracle 11.2.0.4上。我有一个嵌套的解码语句,需要转换为CASE语句。有人能帮上忙吗。我不知道它是如何做的,事实上,我也不完全理解它的逻辑。如果有人能解释它的基本意图和什么是重写的功能使用的案例,这是非常有用的。这是函数.(注意:不要担心表连接,有3个表和一个条件等等,请集中注意解码及其转换为CASE)。此外,我必须手动转换和工具不是一个选项。
CREATE OR REPLACE FUNCTION TMP_Func
RETURN NUMBER
IS
V NUMBER;
BEGIN
SELECT DECODE (
NVL (tab1.flag1, '~'),
'D', DECODE (tab1.code_oid, NVL (tab3.bu_id, '-'), 1, 0),
'C', DECODE (tab1.code_oid, NVL (tab3.cost_id, '-'), 1, 0),
DECODE (tab2.oid,
DECODE (tab1.co_id, NULL, tab2.oid, tab1.co_id), 1,
0))
INTO V
FROM tab1, tab2, tab3
WHERE tab2.OID = tab1.sec_id;
RETURN V;
END;
发布于 2018-09-04 12:15:18
会是这样的:
SELECT CASE
WHEN NVL (tab1.flag1, '~') = 'D'
THEN
CASE
WHEN tab1.code_oid = NVL (tab3.bu_id, '-') THEN 1
ELSE 0
END
WHEN NVL (tab1.flag1, '~') = 'C'
THEN
CASE
WHEN tab1.code_oid = NVL (tab3.cost_id, '-') THEN 1
ELSE 0
END
ELSE
CASE
WHEN tab2.oid =
CASE
WHEN tab1.co_id IS NULL THEN tab2.oid
ELSE tab1.co_id
END
THEN
1
ELSE
0
END
END
INTO v
FROM ...
请注意,FROM
子句包含3个表,但WHERE
只连接其中两个表。那tab3
呢?另外,考虑切换到ANSI连接。
发布于 2018-09-04 12:23:05
就像这样:
select CASE WHEN COALESCE(tab1.flag1,'~') = 'D' THEN
CASE WHEN tab1.code_oid=COALESCE(tab3.bu_id, '-') THEN 1 else 0 end
WHEN COALESCE(tab1.flag1,'~')='C' THEN
CASE WHEN tab1.code_oid=COALESCE(tab3.cost_id, '-') THEN 1 else 0 end
else
CASE WHEN tab2.oid=COALESCE(tab1.co_id,tab2.oid) THEN 1 else 0 end
end
FROM tab1, tab2, tab3
WHERE tab2.OID = tab1.sec_id;
NVL被合并所取代。
将(a,b,c,d,e,.,f)译码改为:
CASE WHEN a=b THEN c
WHEN a=d THEN e
...
else f
end
您的最后一个解码(解码(tab1.co_id,NULL,tab2.ovy,tab1.co_id),1,0)实际上是一个NVL( tab1.co_id,tab2.ovy)
发布于 2018-09-04 12:53:48
以下是你想做的事:
SELECT CASE COALESCE(TAB1.FLAG1, '~')
WHEN 'D' THEN CASE
WHEN TAB1.CODE_OID = COALESCE(TAB3.BU_ID, '-') THEN 1
ELSE 0
END
WHEN 'C' THEN CASE
WHEN TAB1.CODE_OID = COALESCE(TAB3.COST_ID, '~') THEN 1
ELSE 0
END
ELSE CASE
WHEN TAB2.OID = COALESCE(TAB1.CO_ID, TAB2.OID) THEN 1
ELSE 0
END
END
INTO V
FROM TAB1
INNER JOIN TAB2
ON TAB2.OID = TAB2.SEC_ID
CROSS JOIN TAB3;
请注意,NVL和COALESCE在几个方面略有不同,尽管两者似乎都不是其中的一个因素。首先,NVL总是采用两个参数,而合并可以占用尽可能多的您想要提供的-它返回第一个非空参数。其次,NVL总是计算它的两个参数(例如,如果为NVL的一个或两个参数指定了一个函数,则两个函数都被调用),而合并只计算为找到一个非空结果所必需的许多参数;因此,如果为参数提供两个函数,而第一个函数返回一个非空值,则永远不会调用第二个函数。这里不是问题,但在其他情况下可能很重要(由于副作用)。
祝你好运。
https://stackoverflow.com/questions/52165727
复制相似问题