首页 > 解决方案 > 根据 Postgres 中的分隔符替换括号并将列拆分为多行

问题描述

我有一个用';'分隔的列的表。数据如下所示:

row_id    col
1         p.[D389R;D393_W394delinsRD]
2         p.[D390R;D393_W394delinsRD]
3         p.D389R
4.        p.[D370R;D393_W394delinsRD]

我想在任何地方替换'[]'括号并获取文本。后来,我想将字符串拆分为';' 并连接“p”。到拆分的文本(如果不存在)并创建一个新行。

预期的输出是:

row_id    new_col
1         p.D389R
2         p.D393_W394delinsRD
3         p.D390R
4         p.D393_W394delinsRD
5         p.D389R
6         p.D370R
7         p.D393_W394delinsRD

我已尝试以下查询以获得所需的输出。

SELECT *,

        CASE        
            WHEN regexp_split_to_table(regexp_replace(col, '\[|\]', '', 'g'), E';') NOT LIKE 'p.[%' 
                THEN 'p.' || (regexp_split_to_table(regexp_replace(col, '\[|\]', '', 'g'), E';'))[1]
            ELSE regexp_split_to_table(regexp_replace(col, '\[|\]', '', 'g'), E';')[2]
        END AS new_col    


FROM table;

任何建议都会非常有帮助。

标签: regexpostgresql

解决方案


我会首先从字符串中删除常量值(p.[]),然后将其取消嵌套。

with clean as (
  select row_id, regexp_replace(col, '^p\.(\[){0,1}|\]$', '', 'g') as col
  from the_table
)
select row_id, 'p.'|| t.c
from clean c
  cross join unnest(string_to_array(c.col, ';')) as t(c)

CTE ( with ...) 并不是必需的,但这样可以unnest(...)保持可读性。

在线示例


推荐阅读