首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将嵌套解码转换为等效的CASE语句(从Oracle转换为PostgreSQL所需)

将嵌套解码转换为等效的CASE语句(从Oracle转换为PostgreSQL所需)
EN

Stack Overflow用户
提问于 2018-09-04 11:52:47
回答 3查看 3.4K关注 0票数 1

我在Oracle 11.2.0.4上。我有一个嵌套的解码语句,需要转换为CASE语句。有人能帮上忙吗。我不知道它是如何做的,事实上,我也不完全理解它的逻辑。如果有人能解释它的基本意图和什么是重写的功能使用的案例,这是非常有用的。这是函数.(注意:不要担心表连接,有3个表和一个条件等等,请集中注意解码及其转换为CASE)。此外,我必须手动转换和工具不是一个选项。

代码语言:javascript
运行
复制
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;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-04 12:15:18

会是这样的:

代码语言:javascript
运行
复制
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连接。

票数 1
EN

Stack Overflow用户

发布于 2018-09-04 12:23:05

就像这样:

代码语言:javascript
运行
复制
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)译码改为:

代码语言:javascript
运行
复制
  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)

票数 3
EN

Stack Overflow用户

发布于 2018-09-04 12:53:48

以下是你想做的事:

代码语言:javascript
运行
复制
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的一个或两个参数指定了一个函数,则两个函数都被调用),而合并只计算为找到一个非空结果所必需的许多参数;因此,如果为参数提供两个函数,而第一个函数返回一个非空值,则永远不会调用第二个函数。这里不是问题,但在其他情况下可能很重要(由于副作用)。

祝你好运。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52165727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档