我想从以下字符串中提取子字符串来代替md5_object_id
:
{
"associatedEntity": "60056",
"associatedObject": "md5_object_id",
"associatedAttr": "END22206",
"associatedAttr": ""
}
md5_object_id是动态的,可以使用任何有效的md5字符串。 我尝试了一些正则表达式,但我需要最有效的一个,因为我在SQL Join查询中使用了提取的子字符串。我正在使用PostgreSQL 9.2,所以json函数不可用。
答案 0 :(得分:1)
在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中使用正则表达式,但这仍然是一个坏主意。
答案 1 :(得分:0)