oracle - SYS_CONNECT_BY_PATH 和 START WITH/CONNECT BY PostgreSQL 等效项

标签 oracle postgresql

我有一个查询是一个用 Oracle 编写的更大查询的一部分,我需要将其转换为 PostgreSQL。

/*rn and cnt are defined earlier*/
SELECT wtn, LTRIM(SYS_CONNECT_BY_PATH(RESP_TCSI, ','),',') TCSI_CODES
FROM DATA
WHERE rn = cnt
START WITH rn = 1
CONNECT BY PRIOR rn = rn-1
AND PRIOR WTN = WTN

据我所知,在 Postgres 中没有与 SYS_CONNECT_BY_PATH() 等价的东西。我知道 Postgres 在 tablefunc 中有一个 CONNECTBY() 函数,但我不认为它做了 start with 和 connect by bits 所做的事情。我也知道 Postgres 等同于 LTRIM() 是什么,但是如果我必须使用 CONNECTBY() 或类似的东西,我不确定是否修剪字符串很重要。

通过阅读和搜索,我注意到可能有一种方法可以通过一些递归选择来执行此操作,但我不确定我将如何执行此操作,除此之外,我并不真正理解代码的作用。我的假设是它与基于 Oracle 等效项的分层树有关,但即便如此我也不确定。我如何在 Postgres 中执行与此等效或类似的操作?

谢谢。

最佳答案

使用 recursive common table expression :

with recursive tree as (
  select wtn, 
         resp_tcsi as tcsi_codes
   from data
   where rn = 1 -- this is the "start with" part

   union all

   select ch.wtn, 
          p.tcsi_codes||','||ch.resp_tcsi 
   from data as ch
    join tree p 
      on ch.rn -1 = p.rn -- this is the "connect by" part
     and ch.wtn = p.wtn
)
select *
from tree;

关于oracle - SYS_CONNECT_BY_PATH 和 START WITH/CONNECT BY PostgreSQL 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31478176/

相关文章:

oracle - 在Delphi中相当于Oracle NLS_UPPER

sql - 使用 Oracle SQL 解析 Json - JSON_TABLE

regex - 使用列数据作为正则表达式匹配的模式

performance - Oracle CLOB 性能

java - 如何在 Oracle 中全局(或按 session )限制结果集?

sql - 检查plsql中的变量是否为空

sql - Postgres - 找到数组的最小值

sql - 如何根据键值对查询表,其中键是一个整数,值是一个整数列表

node.js - Sequelize @6.3.4 无法连接到 docker -> postgres

postgresql - SQL查询选择公共(public)IP地址