Разделить строку на основе нескольких значений столбца - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть следующая таблица в postgres (ниже показаны только 2 строки).

trial_id    lead_sponsor    lead_sponsor_class  collaborators   collaborators_class 
NCT00004336 NCRR    NIH University of Michigan  Other
NCT00004337 NCRR    NIH null    null

Я хотел бы разбить каждую строку на основе столбцов lead_sponsor и соавторов и создать новый столбец на их основе

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

trial_id    sponsor_company           sponsor_role        agency
NCT00004336 NCRR                      lead_sponsor        NCRR
NCT00004336 University of Michigan    collaborators       University of Michigan
NCT00004337 NCRR                      lead_sponsor        NCRR

Я попробовал пару вещей, но не могу найти решение (я новичок ie в postgres)

SELECT
    *,
    CASE WHEN lead_sponsor is not null THEN lead_sponsor
         WHEN collaborators is not null THEN collaborators
         ELSE ''
    END AS sponsor_company
FROM
    tb ;

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

Спасибо

1 Ответ

1 голос
/ 16 апреля 2020

Вы можете отменить поворот с боковым соединением:

select x.*
from mytable t
cross join lateral (values 
    (trial_id, lead_sponsor,  'lead_sponsor', lead_sponsor),
    (trial_id, collaborators, 'collaborators', collaborators)
) x(trial_id, sponsor_company, sponsor_role, agency)
where x.sponsor_company is not null

Демонстрация на DB Fiddle :

trial_id    | sponsor_company | sponsor_role  | agency    
:---------- | :-------------- | :------------ | :---------
NCT00004336 | NCRR            | lead_sponsor  | NCRR      
NCT00004336 | University      | collaborators | University
NCT00004337 | NCRR            | lead_sponsor  | NCRR      
...