У меня есть следующие столбцы в 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'
Спасибо