【问题标题】:Unable to find alternative for connect by level in postgresql在 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

标签: sql postgresql split regexp-replace


【解决方案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; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 2020-07-30
      相关资源
      最近更新 更多