Разделить значения столбца на основе разделителя и сопоставить с другим столбцом в postgres - PullRequest
1 голос
/ 05 февраля 2020

У меня есть следующие столбцы в таблице в схеме postgres.

ID              feature                    start         end
EBI-15947845    p.C29S                     29            29
EBI-15983374    p.E283C                    283           283
EBI-16057637    p.[L44D;A47D;I66D;L67D]    66            66
EBI-16057637    p.[L44D;A47D;I66D;L67D]    47            47
EBI-16057637    p.[L44D;A47D;I66D;L67D]    44            44
EBI-16057637    p.[L44D;A47D;I66D;L67D]    67            67
EBI-2266598     p.D1305_D1306delinsKK      1305          1306

Я хотел бы преобразовать столбец 'feature' так, чтобы запись соответствовала значению с начальным и конечным столбцами. Для большей ясности ниже приведены желаемые столбцы после преобразования.

ID              feature     start        end
EBI-15947845    p.C29S      29           29
EBI-15983374    p.E283C     283          283
EBI-16057637    p.I66D      66           66
EBI-16057637    p.A47D      47           47
EBI-16057637    p.L44D      44           44
EBI-16057637    p.L67D      67           67
EBI-2266598     p.D1305_D1306delinsKK      1305          1306

Я могу придумать подход, но не могу его реализовать. Значение столбца должно быть разделено на; а затем примените совпадение регулярного выражения к каждому компоненту, используя начальные / конечные значения, и выберите и замените при обнаружении совпадения и объедините с p. .

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

Спасибо

1 Ответ

4 голосов
/ 05 февраля 2020

Я не думаю, что вам действительно нужно разделить значения. Насколько я могу судить, достаточно использовать regexp_match():

select id, 
       case 
         when start = "end" and feature like 'p.[%' 
           then 'p.'||(regexp_match(feature, '([A-Z]'||start||'[A-Z])'))[1] 
         else feature
       end as feature,
       start,
       "end"
from the_table

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

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