如何将Oracle中的指定SQL查询改写为适配PostgreSQL的版本?
Oracle SQL转PostgreSQL等效语句方案
原语句逻辑说明
原Oracle语句实现的是从MOVIES表中查询电影Isle of Dogs(犬之岛)的所有演员姓名,结果按照演员姓名的最后一个空格后的片段(通常为姓氏)升序排序。
原生PostgreSQL等效写法(无兼容扩展依赖)
推荐使用正则替换的简化写法,逻辑和原语句完全一致:
SELECT ACTOR_NAME FROM MOVIES WHERE MOVIE_NAME = 'Isle of Dogs' ORDER BY REGEXP_REPLACE(ACTOR_NAME, '^.* ', '') ASC;
如果想要更贴近原Oracle的字符串截取逻辑,也可以用反向查找位置的写法:
SELECT ACTOR_NAME FROM MOVIES WHERE MOVIE_NAME = 'Isle of Dogs' ORDER BY SUBSTR(ACTOR_NAME, LENGTH(ACTOR_NAME) - POSITION(' ' IN REVERSE(ACTOR_NAME)) + 2) ASC;
该写法和原Oracle逻辑完全对齐:先反向查找字符串中第一个空格的位置,换算得到原字符串中最后一个空格的位置,再从该位置的下一位开始截取字符串用于排序。
兼容扩展场景写法
如果你的PostgreSQL环境安装了Oracle兼容扩展(如oracle_fdw、oracle_compat),可直接使用接近原Oracle的写法即可运行:
SELECT ACTOR_NAME FROM MOVIES WHERE MOVIE_NAME = 'Isle of Dogs' ORDER BY SUBSTR(ACTOR_NAME, INSTR(ACTOR_NAME, ' ', -1)+1) ASC;
内容的提问来源于stack exchange,提问作者mila123
相关产品推荐
相关产品推荐

