方案: 输入表1:需要比较表1的field 2的值与表2的field 3的值 例如: 从svc_lz.fn_abc;svc_lz.fn_cde中 Select ;因此表1的字段2值是 出现在" Select "之后,即svc_lz.fn_abc和svc_lz.fn_cde,因此我们需要 与表2的字段3连接示例:svc_lz.fn_abc和svc_lz.fn_cde.如果存在连接 然后提取分配给表2的字段4并将其放置在输出表字段3中.

输入表1:

field1 field2
a select from svc_lz.fn_abc;svc_lz.fn_cde;
b select *From mfg_lz.fn_test,mfg_a.fn_test1
c select *From mfg_j.fn_test2
d select *From mfg_j.fn_test3;mfg_j.fn_test4;
e select *From mfg_j.fn_test5(100);mfg_j.fn_test6(1000)
f select *From mfg_j.fn_test5_abc(100);mfg_j.fn_test6_abc(1000)

输入表2:

field3 field4
svc_lz.fn_abc {test}
svc_lz.fn_cde {test1,test2}
mfg_lz.fn_test {test3}
mfg_j.fn_test4 {test5}
mfg_j.fn_test5 {}
mfg_j.fn_test6 {test7}

输出:

field1 field2 field3
a select from
svc_lz.fn_abc;svc_lz.fn_cde; test,test1,test2
b select *From mfg_lz.fn_test,mfg_a.fn_test1 test3
c select *From mfg_j.fn_test2 NULL
d select *From mfg_j.fn_test3;mfg_j.fn_test4; test5
e select *From mfg_j.fn_test5(100);mfg_j.fn_test6(1000) test7
f select *From
mfg_j.fn_test5_abc(100);mfg_j.fn_test6_abc(1000) NULL

我搜索并判断需要执行字符串_split并在来自tbl1的字段2和 field3来自tbl2,但我不确定如何开始,我try 过使用CTE 功能,但我是SQL新手,所以很难找到起点.如果 任何人都可以帮忙.

推荐答案

参见实施例

select field1,field2,string_agg(distinct fld,',') field3
from(
select *
from(
select field1,field2,fld
from table1 t1
left join (
    select * from table2
    cross join 
       string_to_table(trim(replace(replace(field4,'{',''),'}','')),',') fld
  )t2
  -- on t1.field2 like concat('%',t2.field3,'%')
  -- more complicated search with regexp
  on concat(t1.field2,';') similar to concat('%',t2.field3,'[();,]%'))x
)b
group by field1,field2

结果是

field1 field2 field3
a select from svc_lz.fn_abc;svc_lz.fn_cde; test,test1,test2
b select *From mfg_lz.fn_test,mfg_a.fn_test1 test3
c select *From mfg_j.fn_test2 null
d select *From mfg_j.fn_test3;mfg_j.fn_test4; test5

第一部分是

select * from table2
cross join string_to_table(trim(replace(replace(field4,'{',''),'}','')),',') fld

此子查询输出是

field3 field4 fld
svc_lz.fn_abc {test} test
svc_lz.fn_cde {test1,test2} test1
svc_lz.fn_cde {test1,test2} test2
mfg_lz.fn_test {test3} test3
mfg_j.fn_test4 {test5} test5

下一步JOIN table 1和扩展table 2(上一个子查询)

select field1,field2,fld
from table1 t1
left join (
    select * from table2
    cross join 
       string_to_table(trim(replace(replace(field4,'{',''),'}','')),',') fld
  )t2
  -- on t1.field2 like concat('%',t2.field3,'%')
  -- more complicated search with regexp
  on concat(t1.field2,';') similar to concat('%',t2.field3,'[();,]%'))x

输出

field1 field2 fld
a select from svc_lz.fn_abc;svc_lz.fn_cde; test
a select from svc_lz.fn_abc;svc_lz.fn_cde; test1
a select from svc_lz.fn_abc;svc_lz.fn_cde; test2
b select *From mfg_lz.fn_test,mfg_a.fn_test1 test3
c select *From mfg_j.fn_test2 null
d select *From mfg_j.fn_test3;mfg_j.fn_test4; test5

Demohere

Postgresql相关问答推荐

在postgres中查找多个表中不同列的计数和总和

PostgreSQL:函数结果表内冲突(...)上的";中的字段名称

mosquito-go-auth with postgres authorization error

为什么我的应用程序接收的是空值而不是布尔值?

在特定值的组聚合中添加标签列作为结果

Postgres - 如何加入两列?

Rails:创建删除表级联迁移

在 to_tsquery 中转义特殊字符

如何在 Postgres 中的列上删除唯一约束?

INSERT RETURNING 是否保证以 right的顺序返回?

在psql中,为什么有些命令没有效果?

在 Spring Boot 上使用 Hibernate 映射 PostGIS 几何点字段

在这个 Dockerfile 中创建的 Postgres 用户名/密码在哪里?

用于更改 postgresql 用户密码的 bash 脚本

如何在 postgres 模式中列出关系

子查询的自连接

postgres regexp_replace 只想允许 a-z 和 A-Z

PostgreSQL 多种认证方式

如何更改 PostgreSQL 中的 REFERENCES?

如何使用 postgresql 按计数排序?