Postgres-动态生成多个行和列并连接到现有表中

问题描述 投票:0回答:1

我正在尝试将oracle查询转换为postgres。

Oracle查询使用以下内容来生成类似于表格的动态数据:

SELECT ROWNUM TYPE_ID, regexp_substr('NED,SED,ZED,MED', '[^,]+', 1, LEVEL) TYPE
FROM DUAL
CONNECT BY regexp_substr('NED,SED,ZED,MED', '[^,]+', 1, LEVEL) IS NOT NULL

Output:
TYPE_ID,TYPE
1,NED
2,SED
3,ZED
4,MED

考虑示例表:

create table details(
Title Varchar,
Misc Varchar
);

insert into details values ('DBA','5 years');

这是整个查询:

select /*ACC DATA*/ (case when ACC.TYPE_ID= 4 then null else
Title end)  Job_title,
ACC.* from DUAL,
(SELECT ROWNUM TYPE_ID, regexp_substr('NED,SED,ZED,MED', '[^,]+', 1, LEVEL) TYPE
FROM DUAL
CONNECT BY regexp_substr('NED,SED,ZED,MED', '[^,]+', 1, LEVEL) IS NOT NULL) ACC,
details

Output looks like this:
JOB_TITLE,TYPE_ID,TYPE
DBA,1,NED
DBA,2,SED
DBA,3,ZED

因此,查询有效地返回了三次详细信息表的每一行,分别以TYPE_ID为1,2,3和TYPE为NED,SED,ZED。

如何在Postgres 11.5中实现?

database oracle postgresql database-migration
1个回答
0
投票
您发现Postres没有有用的“ connect by ...”。但是它确实还有其他同样有用的功能。在这种情况下:(请参阅fiddle

  • 两者都会将字符串解析为单个元素。不幸的是,它们都没有提供枚举。但是,很容易从窗口函数row_number中获得它。因此,您的Oracle语句变为(类型是Postgres中的保留字,并且会生成错误,因此我将类型更改为type_val。)

    select row_number() over() type_id,type_val from (select unnest(string_to_array('NED,SED,ZED,MED',',')) type_val ) sl

    有了该位置,这是将其与详细信息表交叉连接以获取所需内容的简单步骤。 

    with split_list(type_id,type_val) as ( select row_number() over() type_id,type_val from (select unnest(string_to_array('NED,SED,ZED,MED',',')) type_val ) sl ) select title, type_id, type_val from details cross join split_list where type_id != 4;

  • © www.soinside.com 2019 - 2024. All rights reserved.