Regex 替换括号并根据Postgres中的分隔符将列拆分为多行

Regex 替换括号并根据Postgres中的分隔符将列拆分为多行,regex,postgresql,Regex,Postgresql,我有一个表,列之间用“;”分隔。数据如下所示: row_id col 1 p.[D389R;D393_W394delinsRD] 2 p.[D390R;D393_W394delinsRD] 3 p.D389R 4. p.[D370R;D393_W394delinsRD] 我想替换“[]”括号,无论它们在哪里,并获取文本。稍后,我想将字符串拆分为“;”并将“p.”连接到拆分的文本(如果不存在)并创建新行 预期产出为: row_i

我有一个表,列之间用“;”分隔。数据如下所示:

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;


任何建议都会非常有用。

我会首先从字符串中删除常量值(
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(
带…
)实际上不是必需的,但是这样
最不重要的(…)
就可以保持可读性