如何解决将Oracle解码转换为Postgres Case表达式
我们有一个现有的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','2','3','4','5','6','7','8','9',0) != 0
AND P.c_num IS NOT NULL
...rest of query...
谢谢
解决方法
在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'
的意思是:字符串(^
的开头,然后是任何字符(.
),然后是数字({{ 1}})。您还可以使用\d
:
in
-
substr(p.c_num,1,2) in ('0','1','2',...,'9')
上的not null
条件是不必要的-p.c_num
值不与任何正则表达式匹配(在Oracle中,它们也将通过null
测试) -
使用标准联接(使用
decode()
关键字),而不是老式的隐式联接(在on
子句中使用逗号)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。