jsonpgsql函数操作_JSON函数和操作符
表 9-40显⽰了可以⽤于这两个JSON
(参阅第 8.14 节)数据类型的操作符。
表 9-40. json和jsonb操作符操作符右操作数的类型描述⽰例⽰例结果->int获取JSON数组元素(索引从0开始)'[{"a":"foo"},{"b":"bar"}, {"c":"baz"}]'::json->2{"c":"baz"}
->text通过秘钥获取JSON对象字段'{"a": {"b":"foo"}}'::json->'a'{"b":"foo"}
->>int获取JSON数组元素为text'[1,2,3]'::json->>23
->>text获取JSON对象字段为text'{"a":1,"b":2}'::json->>'b'2
#>text[]在指定的路径获取JSON对象'{"a": {"b":{"c": "foo"}}}'::json#>'{a,b}'{"c": "foo"}
#>>text[]在指定的路径获取JSON对象为text'{"a":[1,2,3],"b":[4,5,6]}'::json#>>'{a,2}'3
注意:
有json和jsonb类型的这些操作符的并⾏变体。
字段/元素/路径提取操作符返回和它们的左侧输⼊相同的类型
(不管是json还是jsonb),
除了那些指定返回text类型的操作符,它们强制值为⽂本类型。
如果JSON输⼊的结构没有正确匹配要求,那么字段/元素/路径提取操作符返回NULL,
⽽不是失败;例如,如果不存在这样的元素。
表 9-1
中显⽰的标准⽐较操作符可以⽤于jsonb,
但是不能⽤于json。
它们遵循第 8.14.4 节
中概述的B-tree操作符排序规则。
⼀些更深⼀步的操作符只为jsonb存在,在
表 9-41中显⽰。
许多这样的操作符可以⽤jsonb操作符类索引。
jsonb容器和存在语义的详细描述,请查看
第 8.14.3 节。第 8.14.4 节
描述了这些操作符如何⽤于有效的索引jsonb数据。
表 9-41. 额外的 jsonb 操作符操作符右操作数的类型描述⽰例@>jsonb左侧的JSON值包含右侧的值吗?'{"a":1, "b":2}'::jsonb @>
'{"b":2}'::jsonb
text键/元素字符串 包含JSON值吗?'{"a":1, "b":2}'::jsonb  'b'
|text[]是否存在任⼀键/元素字符串?'{"a":1, "b":2, "c":3}'::jsonb | array['b', 'c']
&text[]是否所有键/元素字符串都存在?'["a", "b"]'::jsonb & array['a', 'b']
表 9-42显⽰了可以⽤于创建json
值的函数。(⽬前,对于jsonb来说没有等效的函数,
但是你可以转换这些函数的结果到jsonb。)
表 9-42. JSON 创建函数函数描述⽰例⽰例结果to_json(anyelement)作为JSON返回该值。数组和复合被转换(递归的)成数组和对象;另外,
如果有⼀个转换从该类型到json,则将使⽤该转换函数执⾏转换;
否则,产⽣JSON标量值。对于任意标量类型,除了数字、布尔或空值,
将使⽤该⽂本表⽰,适当的引⽤和逃逸,使其是⼀个有效的JSON字符串。to_json('Fred said "Hi."'::text)"Fred said \"Hi.\""
array_to_json(anyarray [, pretty_bool])作为JSON数组返回该数组。PostgreSQL多维数组变成JSON数组中的数组。
如果pretty_bool为真,
则在维度-1元素之间添加换⾏。array_to_json('{{1,5},{99,100}}'::int[])[[1,5],[99,100]]
row_to_json(record [, pretty_bool])作为JSON对象返回⾏。如果pretty_bool为 true,
将在级别-1元素之间添加换⾏符。row_to_json(row(1,'foo')){"f1":1,"f2":"foo"}
json_build_array(VARIADIC "any")建⽴⼀个可能不同类型的JSON数组,由可变参数列表组成。json_build_array(1,2,'3',4,5)[1, 2, "3", 4, 5]
json_build_object(VARIADIC "any")建⽴⼀个JSON对象的可变参数列表。按照惯例,
该参数列表由交替的键和值组成。json_build_object('foo',1,'bar',2){"foo": 1, "bar": 2}
json_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[])这种形式的json_object从两个分开的数组中成对的获取键和值。
在所有其他⽅⾯,它与⼀维的形式相同。json_object('{a, b}', '{1,2}'){"a": "1", "b": "2"}
注意:array_to_json和row_to_json的⾏为与
to_json相同,除了提供了⼀个整齐打印的选项。
描述的to_json的⾏为也应⽤到每个由其他JSON创建函数转换的单独的值。
注意:hstore扩展从hstore转换到json,
json值的类型有哪些所以通过JSON创建函数转换的hstore值将表⽰为JSON对象,
⽽不是作为原始的字符串值。
表 9-43显⽰了可以⽤于处理
json和jsonb值的函数。
表 9-43. JSON 处理函数函数返回类型描述⽰例⽰例结果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返回由path_elems指出的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作为text返回由path_elems
指出的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对象中最外⾯的⼀组键。json_object_keys('{"f1":"abc","f
2":{"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
---+---
1 | 2
json_populate_recordset(base anyelement, from_json json)
jsonb_populate_recordset(base anyelement, from_json jsonb)setof anyelement扩展from_json⾥⾯最外层的对象数组到⼀个⾏的集合,
这个集合的字段匹配base定义的记录类型(见下⾯的注意)。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数组到⼀组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数组到⼀组text值的集合。select * from
json_array_elements_text('["foo", "bar"]')value
-----------
foo
bar
json_typeof(json)
jsonb_typeof(jsonb)text作为⽂本字符串返回最外⾯的JSON值的类型。
可能的类型有
Returns the type of the outermost JSON value as a text string.
Possible types areobject、array、string、
number、boolean和null。json_typeof('-123.4')number
json_to_record(json)
jsonb_to_record(jsonb)record从⼀个JSON对象中建⽴⼀个任意的记录(参见下⾯的注意)。
因为所有函数都返回record,调⽤者必须⽤AS
⼦句明确的定义记录的结构。select * from json_to_record('{"a":1,"b":[1,2,3],"c":"bar"}') as x(a int, b text, d text)a | b | d ---+---------+---
1 | [1,2,3] |
json_to_recordset(json)
jsonb_to_recordset(jsonb)setof record从⼀个JSON的对象数组中建⽴⼀个任意的记录集(参见下⾯的注意)。
因为所有函数都返回record,调⽤者必须⽤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字符串中的Unicode转义到相应的单字符。
如果输⼊的类型是jsonb,那么这将不是⼀个问题,因为转换早已完成;
但是如果是json输⼊,那么会导致抛出⼀个错误,就像
第 8.14 节中记录的那样。
注意:在json_populate_record、json_populate_recordset、
json_to_record和json_to_recordset中,
JSON的类型转换是"尽⼒⽽为"的,并且对某些类型来说可能不会产⽣期望值。
JSON键匹配⽬标⾏类型中完全相同的字段名。没有出现在⽬标⾏类型中的JSON字段将从输出中省略,并且不匹配任何JSON字段的⽬标字段将是NULL。
注意:json_typeof函数的null返回值不应该与SQL NULL混淆。
当调⽤json_typeof('null'::json)时,将返回null,
调⽤json_typeof(NULL::json)时,返回SQL NULL。
参阅第 9.20 节获取有关聚合函数json_agg
的信息,json_agg聚合记录值为JSON,
聚合函数json_object_agg聚合值对到JSON对象。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。