【问题标题】:Convert Oracle Decode to Postgres Case expression将 Oracle 解码转换为 Postgres 案例表达式
【发布时间】:2020-08-27 22:58:50
【问题描述】:

我们有一个现有的 Oracle SQL 查询需要转换为 Postgres。解码对我来说很复杂,希望在转换为 Postgres CASE 方面得到一些帮助。

现有 SQL:

SELECT  P.t_id   p_t_id,
            Q.t_id   q_t_id
    FROM    pts Q,
            pts P
    WHERE   P.t_id <> Q.t_id
    AND   ((decode(substr(P.c_num,2,1),
                     '0',  1,
                     '1',  1,
                     '2',  1,
                     '3',  1,
                     '4',  1,
                     '5',  1,
                     '6',  1,
                     '7',  1,
                     '8',  1,
                     '9',  1,
                      0) != 0 
AND     P.c_num IS NOT NULL
...rest of query...

谢谢

【问题讨论】:

    标签: oracle postgresql case decode where-clause


    【解决方案1】:

    在 Postgres 中,我会将查询表述为:

    select p.t_id p_t_id, q.t_id q_t_id
    from pts q
    inner join pts p on p.t_id <> q.t_id
    where p.c_num ~ '^.\d'
    

    理由:

    • 基本上decode() 语句检查字符串p.c_num 的第二个字符是否为数字。这看起来比它需要的更复杂(在 Oracle 和 Postgres 中)。我发现为此使用正则表达式更简单 - '^.\d' 表示:字符串的开头 (^),然后是任何字符 (.),然后是数字 (\d)。你也可以使用in:
    substr(p.c_num, 1, 2) in ('0', '1', '2', ..., '9')
    
    • p.c_num 上的 not null 条件是不必要的 - null 值不匹配任何正则表达式(在 Oracle 中,它们也将通过 decode() 测试)

    • 使用标准连接(使用on 关键字),而不是老式的隐式连接(在from 子句中使用逗号)

    【讨论】:

    • 太棒了,非常感谢@GMB 立即和准确的回答。将尽快检查并将答案标记为正确。谢谢
    猜你喜欢
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多