Единственное, о чем я могу думать, это регулярное выражение для извлечения пар ключ / значение.
select id, name,
(regexp_match(message, '(img_type:=)([^,}]+),{0,1}'))[2] as img_type,
(regexp_match(message, '(key_id:=)([^,}]+),{0,1}'))[2] as key_id,
(regexp_match(message, '(client_status:=)([^,}]+),{0,1}'))[2] as client_status,
(regexp_match(message, '(request_status:=)([^,}]+),{0,1}'))[2] as request_status
from the_table;
regexp_match
возвращает массив совпадений. Поскольку регулярное выражение содержит две группы (одну для «ключа» и одну для «значения»), [2]
занимает второй элемент массива.
Это довольно дорого и подвержено ошибкам (например, если любое из значений содержит ,
и вам нужно иметь дело с указанными значениями). Если у вас есть шанс изменить приложение, в котором хранится значение, вам следует серьезно подумать об изменении кода для сохранения правильного значения JSON, например,
{"img_type": "png", "key_id": "f235", "client_status": "active", "request_status": "open"}'
, тогда вы можете использовать, например, message ->> 'img_type'
для получения значение для ключа img_type
Возможно, вы также захотите рассмотреть правильно нормализованную таблицу, где каждый из этих ключей является реальным столбцом.