Замените скобки и разбейте столбец на несколько строк на основе разделителя в Postgres - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть таблица со столбцом, разделенным ';'. Данные выглядят так:

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

Я хотел бы заменить квадратные скобки [], где бы они ни находились, и получить текст. Позже я хотел бы разбить строку на ';' и объединить "р." в разделенный текст (если его там нет) и создайте новую строку.

Ожидаемый результат:

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;

Любые предложения будут очень полезны.

1 Ответ

0 голосов
/ 27 февраля 2020

Я бы сначала удалил значения констант (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(...) остается читабельным.

Онлайн пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...