sql - 将嵌套解码转换为等效的 CASE 语句(从 Oracle 转换到 PostgreSQL 需要)

标签 sql oracle postgresql case

我在 Oracle 11.2.0.4 上。我有一个嵌套的 DECODE 语句,我需要将其转换为 CASE 语句。有人可以帮忙吗?我不确定它是如何完成的,事实上我并不完全理解它的逻辑。如果有人可以解释它基本上打算做什么以及使用对我非常有用的 CASE 重写的函数是什么。这是功能...(注意:不要担心表连接,有 3 个表和一个条件等。请关注 DECODE 及其到 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;

最佳答案

像这样:

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 被 COALESCE 取代

DECODE(a,b,c,d,e,...,f) 替换为:

  CASE WHEN a=b THEN c
       WHEN a=d THEN e
       ...
       else f 
   end 

你最后一次解码 ( DECODE (tab1.co_id, NULL, tab2.oid, tab1.co_id), 1, 0))) 实际上是一个 NVL( tab1.co_id,tab2.oid)

关于sql - 将嵌套解码转换为等效的 CASE 语句(从 Oracle 转换到 PostgreSQL 需要),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52165727/

相关文章:

postgresql - 在不损失 Hadoop 并行处理能力的情况下,将 SAS 与 Hadoop 集成的最佳方法是什么

sql - 对实体进行分组和求和

sql - 在 Oracle 中找不到表 v$parameter

oracle - 读取Oracle数据库时,在Proc SQL的where子句中使用数据集观察

sql - void 函数抛出 'query has no destination for result data' 错误

postgresql - 列出 PostgreSQL 中物化 View 的授权和权限

sql - 以下模式的递归cte

mysql - 从多个表中选择列?

sql - 甲骨文 |删除表

c# - 这个 SQL 查询如何在 Oracle SQL Developer 中运行而不是在代码中运行?