UDW中Json类型

Json相关操作

操作符 参数类型 作用 例子 执行结果
-> int 获取JSON数组元素,索引以0为开始 select '[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json->2; {"c":"baz"}
-> text 通过键来获取 JSON 对象的域(field) select '{"a": {"b":"foo"}}'::json->'a'; {"b":"foo"}
->> int 获取 JSON 数组元素,然后以 text 形式返回它 select '[1,2,3]'::json->>2; 3
->> text 获取 JSON 对象的域,然后以 text 形式返回它 select '{"a":1,"b":2}'::json->>'b'; 2
#> text[] 获取指定路径上的 JSON 对象 select '{"a": {"b":{"c": "foo"}}}'::json#>'{a,b}'; {"c": "foo"}
#>> text[] 获取指定路径上的 JSON 对象,并以 text 形式返回它 select '{"a":[1,2,3],"b":[4,5,6]}'::json#>>'{a,2}'; 3

Json操作举例

创建json类型的表格,插入数据

CREATE TABLE test_json(id INT , name json)
WITH (APPENDONLY=TRUE,ORIENTATION=COLUMN,compresslevel=5) DISTRIBUTED BY (id);
INSERT INTO test_json VALUES 
(1,'{ "id": 1, "sub": { "subid": 10,"subsub": {"subsubid": 100}}}'),
(2,'{ "id": 20, "sub": { "subid": 200,"subsub": {"subsubid": 2000}}}'),
(1,'{ "id": 1, "sub": { "subid": "test","subsub": {"subsubid": 100}}}'),
(3,'{ "id": 1,"sub":"test","name":"me","ip":"10.10.10.10" }');

json操作类型操作举例:

SELECT * FROM test_json WHERE name->>'id'=1;
 id |                               name                                
----+-------------------------------------------------------------------
  1 | { "id": 1, "sub": { "subid": 10,"subsub": {"subsubid": 100}}}
  1 | { "id": 1, "sub": { "subid": "test","subsub": {"subsubid": 100}}}
  3 | { "id": 1,"sub":"test","name":"me","ip":"10.10.10.10" }
 
 
SELECT * FROM test_json WHERE name->'sub'->>'subid'=10;
 id |                             name                              
----+---------------------------------------------------------------
  1 | { "id": 1, "sub": { "subid": 10,"subsub": {"subsubid": 100}}}
 
SELECT * FROM test_json WHERE name->>'name'='me';
 id |                          name                           
----+---------------------------------------------------------
  3 | { "id": 1,"sub":"test","name":"me","ip":"10.10.10.10" }

Json相关函数

Json创建函数

to_json(anyelement)	
array_to_json(anyarray [, pretty_bool])
row_to_json(record [,pretty_bool])
json_build_array(VARIADIC "any")
json_build_object(VARIADIC "any")
json_object(text[])	
json_object(keys text[], values text[])	

Json处理函数有

json_array_length(json)
json_extract_path(from_json json, VARIADIC path_elems text[])
json_extract_path_text(from_json json, VARIADICpath_elems text[])
json_object_keys(json)
json_populate_record( base anyelement, from_json json)
json_typeof(json)
json_to_record(json)
json_to_recordset(json)
json函数的详细操作请参考文档下面的部分。

Json创建函数

to_json(anyelement)	

以 JSON 格式返回输入的值。 数组和复合数据会被(递归地)转换为数组和对象; 如果有转换函数可以将输入的数据转换为 json 的话,那么使用转换函数; 或者产生一个 JSON 标量(scalar)值。 数字、布尔值和空值(null)之外的其他标量会被表示为文本格式, 并通过正确的引用和转义来保证它是一个合法的 JSON 字符串。如下所示:

array_to_json(anyarray [, pretty_bool])	

以 JSON 数组格式返回输入的数组。 一个UDW多维数组将被转换成一个由多个数组组成的 JSON 数组。如果 pretty_bool的值为 true , 那么则在维度-1元素之间添加换行符。 如下所示:

row_to_json(record [,pretty_bool])

以 JSON 对象格式返回行。如果pretty_bool为 true, 将在级别-1元素之间添加换行符。

json_build_array(VARIADIC "any")

建立一个可能不同类型的JSON数组,由可变参数列表组成。例如:

json_build_object(VARIADIC "any")

建立一个JSON对象的可变参数列表。根据习惯,该参数列表由交替的键和值组成。例如:

json_object(text[])	

输入的文本数组构建一个 JSON 对象。 输入的数组要么就是由偶数个成员组成的一维数组, 数组中的每两个成员组成一个键值对; 要么就是一个二维数组,并且每个内部数组都正好包含两个元素, 这两个元素组成一个键值对。例如:

json_object(keys text[], values text[])	

这个格式的 json_object 函数接受两个数组作为输入, 第一个数组的元素会被用作键值对的键, 而第二个数组的元素则会被用作键值对的值。

Json处理函数

json_array_length(json)

返回最外层的 JSON 数组的元素数量。例如:

json_extract_path(from_json json, VARIADIC path_elems text[])

返回 path_elems 所指向的 JSON 值。 等同于 #> 操作符。例如:

json_extract_path_text(from_json json, VARIADICpath_elems text[])

以 text 格式, 返回 path_elems 所指向的 JSON 值。 效果等同于 #» 操作符。例如:

json_object_keys(json)

返回最外层的 JSON 对象所包含的键。 例如:

json_populate_record( base anyelement, from_json json)

将 from_json 中的对象展开到一个行里面, 这个行的各个列与 base 中定义的 record 类型一致。例如:

json_typeof(json)

以字符串形式返回最外层 JSON 值的类型。可能出现的类型有 object 、 array、string、number 、boolean 和 null 。例如:

json_to_record(json)

根据一个 JSON 对象来构建一个任意的 record 。 和所有返回 record 的函数一样, 调用者必须通过 as 语句来明确地定义 record 的结构。

json_to_recordset(json)

根据一个由 JSON 对象组成的数组, 构建一个任意的 record 集合。 和所有返回 record 的函数一样, 调用者必须通过 as 语句来明确地定义 record 的结构。例如:

如有疑问请联系 技术支持