在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