1. 程式人生 > >6 Greenplum 對JSON的支援

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的物件了。

 

 

或寫成以下形式