将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子句中使用逗号)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...