6 Greenplum 對JSON的支援
6 Greenplum 對JSON的支援
6.1 JSON概述
JSON作為結構化的資料,目前越來越受到開發者的愛戴,它簡單靈活易於理解。是作為儲存資料的一種比較使用的一種格式,greenplum從5.0開始便很好的支援了JSON資料。
參考資料:https://hashrocket.com/blog/posts/faster-json-generation-with-postgresql#how-to
Greenplum官網介紹:https://gpdb.docs.pivotal.io/530/admin_guide/query/topics/json-data.html
6.2 JSON常用運算子與函式
6.2.1 JSON常用運算子
Operator |
Right Operand Type |
Description |
Example |
Example Result |
-> |
int |
Get JSON array element (indexed from zero). |
'[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json->2 |
{"c":"baz"} |
-> |
text |
Get JSON object field by key. |
'{"a": {"b":"foo"}}'::json->'a' |
{"b":"foo"} |
->> |
int |
Get JSON array element as text. |
'[1,2,3]'::json->>2 |
3 |
->> |
text |
Get JSON object field as text. |
'{"a":1,"b":2}'::json->>'b' |
2 |
#> |
text[] |
Get JSON object at specified path. |
'{"a": {"b":{"c": "foo"}}}'::json#>'{a,b}' |
{"c": "foo"} |
#>> |
text[] |
Get JSON object at specified path as text. |
'{"a":[1,2,3],"b":[4,5,6]}'::json#>>'{a,2}' |
3 |
6.2.2 JSON常用的建立函式
array_to_json(anyarray [, pretty_bool])
row_to_json(record [, pretty_bool])
6.2.3 JSON處理函式
json_each(json)
json_each_text(json)
json_extract_path(from_json json, VARIADIC path_elems text[])
json_extract_path_text(from_json json, VARIADIC path_elems text[])
json_object_keys(json)
json_populate_record(base anyelement, from_json json)
json_populate_recordset(base anyelement, from_json json)
json_array_elements(json)
6.3 JSON 運算子常用例項
6.3.1 單組JSON解析
select '{"a":1}'::json ->>'a' as jsondata;
6.3.2 多組JSON解析
select '{"a":1,"b":2}'::json->>'b' as jsondata;
6.3.3 複雜的JSON解析
6.3.3.1 多個JSON子集的解析
select '[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json->2 as jsondata;
注意以上結果查詢的座標是從0開始的,查詢條件必須是索引
6.3.3.2 獲取JSON子集的資料
select '{"a": {"b":{"c": "foo"}}}'::json#>'{a,b}' as jsondata;
注意#>'{a,b}的使用,表示一層一層的查詢
6.3.3.3 獲取一個JSON集合的子元素
select '{"a":[1,2,3],"b":[4,5,6]}'::json#>>'{a,2}' as jsondata;
注意這個JSON寫的格式,以及獲取的順序
6.4 JSON 建立函式的使用
6.4.1 建立int型別的JSON格式資料
select array_to_json('{{1,5},{99,100}}'::int[]) as jsondata;
注意int陣列的json資料已經把原本的格式轉換了。
6.4.2 把行的資料轉化為JSON型別的資料
select row_to_json(row(1,2,'foo')) as jsondata;
注意檢視以上的結果可以看出row是行的資料,結果中f1,f2,f3是預設的欄位的名,在後面將會介紹怎樣獲取欄位名轉化為JSON。
6.5 JSON處理函式的使用
6.5.1 獲取JSON中的資料
select * from json_each('{"a":"foo", "b":"bar"}');
以上結果只顯示出了key與value的值,如果只需要這部分的資料匯出來更好。
6.5.2 獲取JSON中的資料(去除雙引號)
select * from json_each_text('{"a":"foo", "b":"bar"}')
可以注意到與上一個比較value的值去除了雙引,這個資料是比較使用的。
6.5.3 獲取JSON資料中的KEY的值
select * from json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}}') as jsondata;
只把資料的key的值獲取出來了,注意別名的使用,必須放在資料的後面,不知道為啥?
經過測試竟然沒有json_object_values的方法。
6.6 JSON查詢資料的方式
6.6.1 建立支援JSON資料的表
6.6.1.1 建立表的SQL
建立帶有主鍵的表
CREATE TABLE test_json (
ID serial NOT NULL PRIMARY KEY,
info json NOT NULL
);
serial 可以實現自增值
6.6.1.2 插入資料SQL
INSERT INTO test_json (info)
VALUES
(
'{ "customer": "John Doe", "items": {"product": "Beer","qty": 6}}'
),
(
'{ "customer": "Lily Bush", "items": {"product": "Diaper","qty": 24}}'
),
(
'{ "customer": "Josh William", "items": {"product": "Toy Car","qty": 1}}'
),
(
'{ "customer": "Mary Clark", "items": {"product": "Toy Train","qty": 2}}'
);
6.6.1.3 獲取JSON資料的KEY值
SELECT info -> 'customer' AS customer FROM test_json;
以上資料只把制定KEY的VALUE獲取出來,注意使用-> 是不把雙引號去掉的。
SELECT info ->> 'customer' AS customer FROM test_json;
使用->> 就可以把雙引去掉了。
6.6.2 獲取JSON結構中的資料
SELECT
info -> 'items' ->> 'product' AS product
FROM
test_json
ORDER BY
product;
SQL中可以->與->>一起使用,區別就是結果有無雙引的問題。
6.6.3 按照條件查詢資料
SELECT
info ->> 'customer' AS customer
FROM
test_json
WHERE
info -> 'items' ->> 'product' = 'Diaper'
查詢條件也可以作為解析的物件。
也可以寫成以下的形式
SELECT
info ->> 'customer' AS customer,
info -> 'items' ->> 'product' AS product
FROM
test_json
WHERE
CAST (
info -> 'items' ->> 'qty' AS INTEGER
) = 2
info -> 'items' ->> 'qty' AS INTEGER 是獲取json集合中元素是qty的資料 轉化為INTEGER,
case() 是把數值轉化為int4型別
6.6.4 集合函式查詢JSON資料
SELECT
MIN(CAST( info -> 'items' ->> 'qty' AS INTEGER)),
MAX (CAST (info -> 'items' ->> 'qty' AS INTEGER)),
SUM (CAST (info -> 'items' ->> 'qty' AS INTEGER)),
AVG (CAST (info -> 'items' ->> 'qty' AS INTEGER))
FROM
test_json
6.6.5 使用預設的函式查詢資料
6.6.5.1 JSON_EACH 函式的使用
SELECT
json_each(info)
FROM
test_json;
json_each 函式把含有key與value的資料全部取了出來,如果一行有多個key與value則會把分行顯示出來。
6.6.5.2 JSON_OBJECT_KEYS 函式的使用
SELECT
json_object_keys (info->'items') as jsondata
FROM
test_json;
6.6.6 把查詢資料轉化為JSON
6.6.6.1 檢視原始資料
select * from test_json_date;
6.6.6.2 把查詢的資料轉化為JSON
6.6.6.2.1 把欄位的名字作為JSON物件
select row_to_json(test_json_date) from test_json_date;
test_json_date 是表的名字,row_to_json() 裡面的也是表裡面的名字
6.6.6.2.2 使用預設的JSON欄位名字
select row_to_json(row(field1, field2)) from test_json_date;
可以看出已使用預設的欄位作為JSON的物件了。
或寫成以下形式