Объединить значения столбцов на основе указанных c шаблонов в столбце в Postgres - PullRequest
1 голос
/ 04 марта 2020

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

row_id  seq         symbol
37697   QQQQQQQQQQ  p.Q296[65]
37698   QQQQQQQ     p.Q296[65]
37760   HNHH        p.Q296[65]
37761   HNHH        p.Q296[65]
47791   QQQ         p.Q296[65]
47792   QQQ         p.Q296[65]
47793   HNHH        p.Q296[65]
47794   HNHH        p.Q296[65]
47795   NHRFCDS     p.Q296

Я хочу объединить извлеченные и сгенерированные строки (p.Q296, Q297, ins) из 'symbol' и 'seq', если seq запускается с 'Q' и символ имеет шаблон, соответствующий значению в столбце. Впоследствии отбросьте строки, в которых отсутствует вышеуказанный шаблон (не в состоянии понять, как это реализовать).

Приведенный ниже запрос не может перехватить шаблон и не объединить строки.

Требуемый вывод:

row_id  seq         new_col
37697   QQQQQQQQQQ  p.Q296_Q297insQQQQQQQQQQ
37698   QQQQQQQ     p.Q296_Q297insQQQQQQQ
47791   QQQ         p.Q296_Q297insQQQ
47792   QQQ         p.Q296_Q297insQQQ
47795   NHRFCDS     p.Q296                                                      

Я использую следующий запрос для этого.


SELECT              
   row_id,
   seq,                 

           CASE 

                WHEN symbol ~ '(^p..\d+)\[\d+]$'  AND  seq ~ '^Q.*')   
                THEN (substring(symbol, '(^p..\d+)\[\d+]$')) || '_' || ((substring(symbol, '^p..(\d+)\[\d+]$'))::INT)+1 ||  'ins' || seq

                WHEN symbol ~ '(^p..\d+)\[\d+]$'  AND  seq !~ '^Q.*')   
                THEN DROP ....

                ELSE symbol

                END AS new_col



                FROM table;

Объяснение регулярного выражения:

'(^p..\d+)\[\d+]$') --> extract  p.Q296
_  --> used for concatenation
^p..(\d+)\[\d+]$'))::INT)+1  --> extract the value after Q and add 1 to it
ins --> concatenate string 'ins'
seq --> concatenate value from column 'seq' 

Спасибо

1 Ответ

0 голосов
/ 04 марта 2020

Попробуйте это:

select
  row_id, seq,
  case
    when seq like 'Q%' and symbol ~ '^p..\d+\[\d+\]$' then
      concat(
        regexp_replace(symbol, '\[.+', ''),
        '_',
        substring (symbol, 3, 1),
        cast (substring (symbol from 'p..(\d+)') as integer) + 1,
        'ins',
        seq
      )
    else symbol
  end as new_col
from foo
where
  seq like 'Q%' or symbol !~ '^p..\d+\[\d+\]$'

"Строки отбрасывания" можно просто вызвать, указав ваши условия в предложении where.

Я запустил его для ваших примеров данных и получил следующее:

37697   QQQQQQQQQQ  p.Q296_Q297insQQQQQQQQQQ
37698   QQQQQQQ     p.Q296_Q297insQQQQQQQ
47791   QQQ         p.Q296_Q297insQQQ
47792   QQQ         p.Q296_Q297insQQQ
47795   NHRFCDS     p.Q296
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...