Обрезать текстовое поле PostgreSQL с помощью регулярных выражений (или еще) - PullRequest
0 голосов
/ 07 ноября 2019

Я хотел бы выполнить сложную задачу по подстроке или обрезке поля со значениями, такими как:

"{"itemID":["15671\/3#1#<b>4202</b>","15686\/4#1#<b>4203</b>","15687\/1#1#<b>4203</b>"]}"  
"{"itemID":["15671\/3#1#<b>4204</b>","15687\/1#1#<b>4204</b>"]}"  
"{"itemID":["10966\/4#1#<b>4201</b>"]}"  

Желаемый результат должен выглядеть следующим образом:

"4202, 4203, 4203"  
"4204, 4204"  
"4201" 

Другими словамичетыре цифры перед каждой запятой (если есть) и последние 4 цифры.

Еще лучше, если есть способ различать значения в ячейке:

"4202, 4203"  
"4204"  
"4201"  

Я читал несколько на первый взглядсоответствующие вопросы, включая this , но не нашли ничего достаточно близкого.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Используя регулярное выражение, принимая значения, потенциально не являющиеся json, потенциально не заканчивающиеся четырьмя цифрами, и отменяйте массив значений для имитации вашей таблицы:

SELECT col, (SELECT STRING_AGG(DISTINCT r[1], ',') FROM REGEXP_MATCHES(col, '([\d]{4})"[,\]]', 'g') r)
FROM UNNEST(ARRAY[
    '{"itemID":["15671\/3#1#4202","15686\/4#1#4203","15687\/1#1#4203"]}',
    '{"itemID":["15671\/3#1#4204","15687\/1#1#4204"]}',
    '{"itemID":["10966\/4#1#4201"]}'
]::TEXT[]) AS col
GROUP BY col

Группировка по col только для того, чтобы иметьДля некоторого идентифицирующего строки значения для группировки первичный ключ был бы идеальным.

Результат:

| col                                                                | string_agg |
| ------------------------------------------------------------------ | ---------- |
| {"itemID":["15671\/3#1#4202","15686\/4#1#4203","15687\/1#1#4203"]} | 4202,4203  |
| {"itemID":["15671\/3#1#4204","15687\/1#1#4204"]}                   | 4204       |
| {"itemID":["10966\/4#1#4201"]}                                     | 4201       |
0 голосов
/ 07 ноября 2019

Если эти значения всегда являются допустимыми JSON, вы можете использовать следующее (при условии, что в этой таблице есть столбец первичного ключа):

select t.id, string_agg(distinct right(item.id, 4), ',') as ids
from schema01.table01 t
   cross join jsonb_array_elements_text(t.the_column::jsonb -> 'itemID') as item(id)
group by t.id;   

Пример в сети: https://rextester.com/SUWG96428

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