我正在尝试将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中实现?
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;