在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为一个不使用unicode转义的简化形式,不允许转义引号,不允许嵌套对象作为值等,可以在Pg中使用正则表达式,但它仍然是一个坏主意。
那是一个* JSON *对象或东西(请提供适当的标记)?你究竟是什么意思*“提取子字符串代替'md5_object_id'”*?提供一些示例输入数据和预期输出。另外重要的是你张贴你试过的东西(*“我试过一些正则表达式”*是不够的)。 – ADTC