摘要: 这篇博客主要介绍的是 json, json_build_array, json_build_object, json_object, json_to_record,
json_to_recordset,
介绍 json 函数
json_build_array() 和 json_build_object 允许建立任意复杂的 json 树,
json_object() 变成一两个二维数组或两个单独的数组, 输入 json_object 的是 键值对, 类似于 hstore () 函数。
json_object_agg() 将两个json对象变量成为一个单独的json对象,作为名字部分
现在我们来通过具体的查询语句来了解这些 json 函数
json_build_array
json_build_object
json_object
json_to_record
json_to_recordset
现在开始, 我们一一介绍。
json_build_array
这个函数是根据不同类型的不同值构建json数组。搜易,你可以创建根据 text, number 等构建
select json_build_array('depesz', 123, 3.14, 'postgresql');
json_build_array
["depesz", 123, 3.14, "postgresql"]
(1 row)
json_build_object
返回基于参数的对象(散列?) , 假设奇数参数是键, 甚至参数是值, 如下所示:
select json_build_object('pi', 3.14, 'database', 'postgresql');
json_build_object
{"pi" : 3.14, "database" : "postgresql"}
(1 row)
json_object
这里有两个函数, 他们具有相同的名字, 但是他们的参数不一样, 所以,我们需要具体的例子来显示。
json_object 只有一个参数的时候, 他的作用类似于 json_build_object()
select json_object ('{pi, 3.14, database, postgresql}' :: text[]);
json_object
{"pi" : "3.14", "database" : "postgresql"}
(1 row)
json_object 它具有两个数组, 且数组内的值任意
select json_object('{e, pi, tau}'::text[], '{2.718, 3.141, 6.283}'::text[] );
json_object
{"e" : "2.718", "pi" : "3.141", "tau" : "6.283"}
(1 row)
json_to_record
将给定的json对象转换为自定义(按调用要求)数据类型的记录
select * from json_to_record ('{"pi":"3.14","database":"postgresql"}', true) as j (pi numeric, database text);
上述语句中 json_to_record 的第二个参数是 ‘true’ , 这是为什么呢?
从测试中可以推断, 如果有数组嵌套结构 (即对象中的给定键值不是一个标量,它是一个对象或者数组), 那么
如果我们将第二个参数修改为 'false', 函数将会失败,
ERROR: cannot call json_populate_record on a nest object
通过这种方式可以避免对复杂结构拆包操作。
json_to_recordset
json_to_recordset 的作用和json_to_record作用是一样的, 但是他可以返回多个json对象
select * from json_to_recordset (
'[{"name":"e", "value":2.718},
{"name":"pi", "value":3.141},
{"name":"tau", "value":6.283}]', true
) as x (name text, value numeric);
">https://www.depesz.com/2014/01/30/waiting-for-9-4-new-json-functions/>