В PostgreSQL 9.3 и выше, используйте тип json
и оператор ->>
:
regress=> SELECT json('{
"associatedEntity": "60056",
"associatedObject": "md5_object_id",
"associatedAttr": "END22206",
"associatedAttr": ""
}')->> 'associatedObject';
?column?
---------------
md5_object_id
(1 row)
Поскольку вы не указали версию, я буду счастливо предполагаем, что вы находитесь на текущей версии, поэтому вы можете использовать это.
Используя регулярное выражение для этой работы является страшной идеи; например, синтаксический анализ HTML с помощью регулярных выражений, он использует неправильный инструмент для задания. Таким образом, вместо того, чтобы использовать процедурный язык с библиотекой JSon:
CREATE LANGUAGE plperlu;
CREATE OR REPLACE FUNCTION json_get_key(object json, keyname text) returns text as $$
use strict;
use warnings;
use JSON;
return decode_json($_[0])->{$_[1]};
$$ LANGUAGE plperlu;
postgres=# SELECT json_get_key(json('{"a":1, "b":"c"}') , 'b');
json_get_key
--------------
c
(1 row)
или:
CREATE LANGUAGE plpythonu;
CREATE OR REPLACE FUNCTION json_get_key_py(object json, keyname text) returns text AS $$
import json
return json.loads(object)[keyname]
$$ LANGUAGE plpythonu;
postgres=# SELECT json_get_key_py(json('{"a":1, "b":"c"}') , 'b');
json_get_key_py
-----------------
c
(1 row)
Не можете использовать процедурные языки либо? Ваш лучший выбор - это, вероятно, получить это для клиента и расшифровать его там.
Если вы можете ограничить свой json упрощенной формой, которая не использует escape-символы unicode, не позволяет экранировать экранированные кавычки, не позволяет вложенным объектам как значениям и т. Д., Может быть возможно использовать регулярное выражение в Pg , но это все еще плохая идея.
Это что * JSON * объект или что-то (пожалуйста, укажите соответствующие тэги)? Что именно вы подразумеваете под * «извлекаете подстроку вместо« md5_object_id' »*? Укажите некоторые входные данные и ожидаемый результат. Также важно, чтобы вы опубликовали то, что вы пробовали (* «Я попробовал некоторое регулярное выражение» * недостаточно). – ADTC