在 postgresql 中找不到按级别连接的替代方法
Posted
技术标签:
【中文标题】在 postgresql 中找不到按级别连接的替代方法【英文标题】:Unable to find alternative for connect by level in postgresql 【发布时间】:2021-05-02 11:35:58 【问题描述】:select
trim(regexp_substr(t.column_A, '[^,]+', 1, levels.column_value)) as column_A
from (SELECT * FROM table_t t ) t,
table(cast(multiset(select level from dual
connect by level <= length (regexp_replace(t.column_A, '[^,]+')) + 1) as sys.OdciNumberList)) levels
无法在 postgresql 中找到按级别连接的替代方法。 在 postgresql 中也不存在对偶。
如果有人帮我确定上述查询的替代方案,那将是非常有帮助的。
【问题讨论】:
请提供示例数据、期望的结果以及您要实现的逻辑的说明。 如果不解释该代码的作用,这几乎是不可能回答的。您可能只想要select * from table_t t cross join unnest(string_to_array(t.column_a, ',')) as x(column_a)
独立于DBMS,from (SELECT * FROM table_t t ) t
部分可以简化为from table_t t
postgres 等效项是递归 CTE。 (也应该在 Oracle 上工作)并且:您不需要 dual
。
【参考方案1】:
SELECT * FROM generate_series(1,10);
将生成数字在 1 到 10 之间的行,方式与
相同select level from dual connect by level <= 10
在 Oracle 中执行
【讨论】:
【参考方案2】:您没有定义您的table_t
,所以我假设column_a
是一个逗号分隔的字符串,因为这似乎是Oracle 正在寻找的。如果这是正确的,那么也许最简单的方法是将字符串转换为数组,然后展开数组。幸运的是,Postgres 分别为每个动作 string_to_array 和 unnest 提供了单个函数。 (请参阅文档:Array Functions and Operators)。
with table_t( column_a) as
( values ( 'abc,defgh,ijklm,nopqr,stuvw,zyz0123,456789'))
select unnest (string_to_array(column_a,','))
from table_t;
【讨论】:
以上是关于在 postgresql 中找不到按级别连接的替代方法的主要内容,如果未能解决你的问题,请参考以下文章
在 postgresql 中按级别和 regexp_substr 连接