json数据相关的函数和计算。
越来越的人喜欢直接把json数据存入数据库,各个数据库也都在支持json类型,所以对于json相关的函数和运算应该掌握了解。
Operator |
Right Operand Type |
Description |
Example |
Example Result |
-> |
int |
获取json中的元素 |
'[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json->2 |
{"c":"baz"} |
-> |
text |
获取json中的对象 |
'{"a": {"b":"foo"}}'::json->'a' |
{"b":"foo"} |
->> |
int |
获取json数组中的元素 |
'[1,2,3]'::json->>2 |
3 |
->> |
text |
获取json中的对象 |
'{"a":1,"b":2}'::json->>'b' |
2 |
#> |
text[] |
从给定的路径中查询json对象 |
'{"a": {"b":{"c": "foo"}}}'::json#>'{a,b}' |
{"c": "foo"} |
#>> |
text[] |
从给定的路径中查询json对象 |
'{"a":[1,2,3],"b":[4,5,6]}'::json#>>'{a,2}' |
3 |
Operator |
Right Operand Type |
Description |
Example |
@> |
jsonb |
判断是否包含 |
'{"a":1, "b":2}'::jsonb @> '{"b":2}'::jsonb |
<@ |
jsonb |
判断是否包含 |
'{"b":2}'::jsonb <@ '{"a":1, "b":2}'::jsonb |
? |
text |
判断是否包含 |
'{"a":1, "b":2}'::jsonb ? 'b' |
?| |
text[] |
判断是否包含其中一个 |
'{"a":1, "b":2, "c":3}'::jsonb ?| array['b', 'c'] |
?& |
text[] |
判断是否包含全部 |
'["a", "b"]'::jsonb ?& array['a', 'b'] |
|| |
jsonb |
连接 |
'["a", "b"]'::jsonb || '["c", "d"]'::jsonb |
- |
text |
删除键值对 |
'{"a": "b"}'::jsonb - 'a' |
- |
text[] |
删除键值对 |
'{"a": "b", "c": "d"}'::jsonb - '{a,c}'::text[] |
- |
integer |
删除数组中的元素 |
'["a", "b"]'::jsonb - 1 |
#- |
text[] |
删除json数组中的元素 |
'["a", {"b":1, "c":2}]'::jsonb #- '{1,b}' |
Function |
Description |
Example |
Example Result |
to_json(anyelement) to_jsonb(anyelement) |
转换为JSON或JSONB。数组和复合类型被(递归地)转换为数组和对象;否则,如果存在从类型到JSON的强制转换,则将使用计算函数执行转换;否则,将产生标量值。对于任何除数字、布尔值或空值以外的任何标量类型,文本表示将以这样的方式使用,即它是有效的JSON或JSONB值。 |
to_json('Fred said "Hi."'::text) |
"Fred said \"Hi.\"" |
array_to_json(anyarray [, pretty_bool]) |
将数组作为JSON数组返回。PostgreSQL多维数组成为数组的JSON数组。 |
array_to_json('{{1,5},{99,100}}'::int[]) |
[[1,5],[99,100]] |
row_to_json(record [, pretty_bool]) |
将行作为JSON对象返回。如果pretty_bool是true,将在 level-1 元素之间添加行反馈。 |
row_to_json(row(1,'foo')) |
{"f1":1,"f2":"foo"} |
json_build_array(VARIADIC "any") jsonb_build_array(VARIADIC "any") |
从变量参数列表中构建可能不均匀类型的JSON数组。 |
json_build_array(1,2,'3',4,5) |
[1, 2, "3", 4, 5] |
json_build_object(VARIADIC "any") jsonb_build_object(VARIADIC "any") |
从变量参数列表中构建JSON对象。按照惯例,参数列表由交替键和值组成。 |
json_build_object('foo',1,'bar',2) |
{"foo": 1, "bar": 2} |
json_object(text[]) jsonb_object(text[]) |
从文本数组中构建JSON对象。该数组必须具有精确的一维且具有偶数个成员,在这种情况下,它们被用作交替的键/值对,或者两个维度,使得每个内部数组具有正好两个元素,它们被用作键/值对。 |
json_object('{a, 1, b, "def", c, 3.5}') json_object('{{a, 1},{b, "def"},{c, 3.5}}') |
{"a": "1", "b": "def", "c": "3.5"} |
json_object(keys text[], values text[]) jsonb_object(keys text[], values text[]) |
json_object形式从两个单独的数组中获得键和值 |
json_object('{a, b}', '{1,2}') |
{"a": "1", "b": "2"} |
Function |
Return Type |
Description |
Example |
Example Result |
json_array_length(json) jsonb_array_length(jsonb) |
int |
JSON数组中元素的个数 |
json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]') |
5 |
json_each(json) jsonb_each(jsonb) |
setof key text, value json setof key text, value jsonb |
将JSON数据设置为键值对输出 |
select * from json_each('{"a":"foo", "b":"bar"}') |
key | value -----+------- a | "foo" b | "bar" |
json_each_text(json) jsonb_each_text(jsonb) |
setof key text, value text |
将JSON数据设置为键值对输出。返回的值设为text类型 |
select * from json_each_text('{"a":"foo", "b":"bar"}') |
key | value -----+------- a | foo b | bar |
json_extract_path(from_json json, VARIADIC path_elems text[]) jsonb_extract_path(from_json jsonb, VARIADIC path_elems text[]) |
json jsonb |
根据路径,返回json值 |
json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}','f4') |
{"f5":99,"f6":"foo"} |
json_extract_path_text(from_json json, VARIADIC path_elems text[]) jsonb_extract_path_text(from_json jsonb, VARIADIC path_elems text[]) |
text |
根据路径返回json值 |
json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}','f4', 'f6') |
foo |
json_object_keys(json) jsonb_object_keys(jsonb) |
setof text |
返回json中的所有键(key) |
json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}}') |
json_object_keys ------------------ f1 f2 |
json_populate_record(base anyelement, from_json json) jsonb_populate_record(base anyelement, from_json jsonb) |
anyelement |
将from_json中的对象展开为其列与BASE定义的记录类型匹配的行。 |
select * from json_populate_record(null::myrowtype, '{"a": 1, "b": ["2", "a b"], "c": {"d": 4, "e": "a b c"}}') |
a | b | c ---+-----------+------------- 1 | {2,"a b"} | (4,"a b c") |
json_populate_recordset(base anyelement, from_json json) jsonb_populate_recordset(base anyelement, from_json jsonb) |
setof anyelement |
将from_json中最外的对象数组扩展为一组行,其行与基定义的记录类型相匹配 |
select * from json_populate_recordset(null::myrowtype, '[{"a":1,"b":2},{"a":3,"b":4}]') |
a | b ---+--- 1 | 2 3 | 4 |
json_array_elements(json) jsonb_array_elements(jsonb) |
setof json setof jsonb |
返回json数组 |
select * from json_array_elements('[1,true, [2,false]]') |
value ----------- 1 true [2,false] |
json_array_elements_text(json) jsonb_array_elements_text(jsonb) |
setof text |
返回json的属组value |
select * from json_array_elements_text('["foo", "bar"]') |
value ----------- foo bar |
json_typeof(json) jsonb_typeof(jsonb) |
text |
将最外JSON值的类型作为文本字符串返回。可能的类型是对象、数组、字符串、数字、布尔和null。 |
json_typeof('-123.4') |
number |
json_to_record(json) jsonb_to_record(jsonb) |
record |
从对象的JSON数组构建任意一组记录。与所有函数返回记录一样,调用必须用as子句显式定义记录的结构 |
select * from json_to_record('{"a":1,"b":[1,2,3],"c":[1,2,3],"e":"bar","r": {"a": 123, "b": "a b c"}}') as x(a int, b text, c int[], d text, r myrowtype) |
a | b | c | d | r ---+---------+---------+---+--------------- 1 | [1,2,3] | {1,2,3} | | (123,"a b c") |
json_to_recordset(json) jsonb_to_recordset(jsonb) |
setof record |
从对象的JSON数组构建任意一组记录。与所有函数返回记录一样,调用必须用as子句显式定义记录的结构 |
select * from json_to_recordset('[{"a":1,"b":"foo"},{"a":"2","c":"bar"}]') as x(a int, b text); |
a | b ---+----- 1 | foo 2 | |
json_strip_nulls(from_json json) jsonb_strip_nulls(from_json jsonb) |
json jsonb |
返回from_json中所有空值的对象字段。其他空值未被触碰。 |
json_strip_nulls('[{"f1":1,"f2":null},2,null,3]') |
[{"f1":1},2,null,3] |
jsonb_set(target jsonb, path text[], new_value jsonb[,create_missing boolean]) |
jsonb |
返回由new_value替换的路径指定的目标,或者如果create_missing设置为true并且路径指定的项不存在,new_value被添加。 |
jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}','[2,3,4]', false) jsonb_set('[{"f1":1,"f2":null},2]', '{0,f3}','[2,3,4]') |
[{"f1":[2,3,4],"f2":null},2,null,3] [{"f1": 1, "f2": null, "f3": [2, 3, 4]}, 2] |
jsonb_insert(target jsonb, path text[], new_value jsonb, [insert_after boolean]) |
jsonb |
返回被插入的new_value。如果由路径指定的目标段位于JSONB数组中,则new_value将在目标之前插入,或之后插入为true(默认之后插入)。如果由路径指定的目标段在JSONB对象中,则仅当目标不存在时才插入new_value。与路径为导向的运算符一样,从JSON数组的末尾出现在路径计数中的负整数。 |
jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"') jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"', true) |
{"a": [0, "new_value", 1, 2]} {"a": [0, 1, "new_value", 2]} |
jsonb_pretty(from_json jsonb) |
text |
将JSON数据格式化为标准格式 |
jsonb_pretty('[{"f1":1,"f2":null},2,null,3]') |
[ { "f1": 1, "f2": null }, 2, null, 3 ] |