簡體   English   中英

根據 Postgres 中的分隔符替換括號並將列拆分為多行

[英]Replace brackets and splitting a column into multiple rows based on a delimiter in 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;

任何建議都會非常有幫助。

我會首先從字符串中刪除常量值( 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(...)保持可讀。

在線示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM