Разделить значение столбца на несколько строк на основе наличия специального символа и совпадения строки в Postgres - PullRequest
0 голосов
/ 19 июня 2020

У меня есть следующая таблица в Postgres11

col1            col2                       col3
NCT00065442 APC-Placebo                    apc-placebo
NCT00135226 Placebo                        placebo
NCT00146640 MR Prednisone                  mr prednisone
NCT00146640 Placebo - IR Prednisone        placebo - ir prednisone

Я хотел бы разделить col3, если в строке есть плацебо и специальные символы '-'.

Желаемый результат:

col1            col2                       col3
NCT00065442 APC-Placebo                    apc
NCT00065442 APC-Placebo                    placebo
NCT00135226 Placebo                        placebo
NCT00146640 MR Prednisone                  mr prednisone
NCT00146640 Placebo - IR Prednisone        placebo
NCT00146640 Placebo - IR Prednisone        ir prednisone

До сих пор я пробовал выполнять следующие запросы.

select *, 
case when col3 ilike '%placebo%' and col3 ~* '-'
        then unnest(string_to_array(col3, '-'))
     else col3
end
from table 
order by col1;

Я также попробовал заменить функцию unnest (string_to_array) следующим образом:

UNNEST(REGEXP_SPLIT_TO_ARRAY(t.name, '\s*[-]\s*'))

1 Ответ

1 голос
/ 19 июня 2020

Такие функции, как unnest(), не допускаются внутри выражения CASE. Вы можете сделать это с помощью UNION ALL:

select col1, col2, trim(unnest(string_to_array(col3, '-'))) col3
from tablename 
where col3 like '%placebo%'
union all
select col1, col2, col3                
from tablename 
where col3 not like '%placebo%'

См. демо . Результатов:

| col1        | col2                    | col3          |
| ----------- | ----------------------- | ------------- |
| NCT00065442 | APC-Placebo             | apc           |
| NCT00065442 | APC-Placebo             | placebo       |
| NCT00135226 | Placebo                 | placebo       |
| NCT00146640 | Placebo - IR Prednisone | placebo       |
| NCT00146640 | Placebo - IR Prednisone | ir prednisone |
| NCT00146640 | MR Prednisone           | mr prednisone |
...