1.JSON類型
PostgreSQL支持JSON和JSONB。這兩種類型在使用上幾乎完全一致,主要區別是:
(1)JSON類型把輸入的數據原封不動的存放到數據庫中。JSONB類型在存放時把JSON解析成二進制格式。
(2)JSONB支持在其上建索引,而JSON不能,這是JSONB的一個很大的優點。
(3)JSON中會保留多余的空格,保留重復的Key,保留Key的順序。JSONB則完全相反,不保留多余的空格,不保留重復的Key,不保留Key的順序。
JSON類型與PostgreSQL數據庫類型的映射:
JSON類型 PostgreSQL類型 注意事項
string text 注意字符集的一些限制
number numeric JSON中沒有PostgreSQL中的“NaN”,“infinity”
boolean boolean JSON僅能接受小寫的“true”和“false”
null (none) SQL中的NULL代表不同的意思
一、將結果集封裝成JSON
關於如何查詢返回 JSON,這里 有例子,翻譯如下:
一個簡單的用法就是使用 row_to_json() 函數,它接受 “行值”並返回 JSON 對象:
1
|
select
row_to_json(tableName)
from
tableName;
|
上面查詢語句返回結果類似如下:
1
|
{
"id"
:6013,
"text"
:
"advancement"
,
"pronunciation"
:
"advancement"
,...}
|
但是有時候我們只需要查詢指定的列,那么我們可以使用 row() 結構函數:
select row_to_json(row(id, text)) from tableName;
上面查詢語句返回了我們想要的結果,可惜丟失了列名:
1
|
{
"f1"
:6013,
"f2"
:
"advancement"
}
|
為了完善這個需求,我們必須創建一個行類型且將結果轉換(cast)到這個行類型,或者使用子查詢。子查詢會更容易一些:
1
2
3
4
|
select
row_to_json(t)
from
(
select
id, text
from
tableName
)
AS
t
|
上面查詢語句返回了我們希望的樣子:
1
|
{
"id"
:6013,
"text"
:
"advancement"
}
|
另一種常用的技術是 array_agg 和 array_to_json。array_agg 是一個聚合函數 sum 或 count。它聚集成一個 PostgreSQL 數組參數。array_to_json 以 PostgreSQL數組 拼合成一個單一的JSON值。
我們來看看 array_to_json 的用法:
1
2
3
4
|
select
array_to_json(array_agg(row_to_json(t)))
from
(
select
id, text
from
tableName
)
AS
t
|
上面查詢語句返回了一個由 JSON 對象組成的數組:
1
|
[{
"id"
:6001,
"text"
:
"abaissed"
},{
"id"
:6002,
"text"
:
"abbatial"
},{
"id"
:6003,
"text"
:
"abelia"
},...]
|
我們來一個復雜的例子(注:這個例子可能有問題):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
select
row_to_json(t)
from
(
select
text, pronunciation,
(
select
array_to_json(array_agg(row_to_json(d)))
from
(
select
part_of_speech, body
from
definitions
where
word_id=words.id
order
by
position
asc
) d
)
as
definitions
from
words
where
text =
'autumn'
|
上面查詢語句返回結果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
{
"text"
:
"autumn"
,
"pronunciation"
:
"autumn"
,
"definitions"
: [
{
"part_of_speech"
:
"noun"
,
"body"
:
"skilder wearifully uninfolded..."
},
{
"part_of_speech"
:
"verb"
,
"body"
:
"intrafissural fernbird kittly..."
},
{
"part_of_speech"
:
"adverb"
,
"body"
:
"infrugal lansquenet impolarizable..."
}
]
}
|
二、json解析
一些最常見的PostgreSQL JSON運算符和處理JSON數據的函數。
JSON代表JavaScript Object Notation。JSON是一種開放的標准格式,由鍵值對組成。JSON的主要用途是在服務器和Web應用程序之間傳輸數據。與其他格式不同,JSON是人類可讀的文本。
從版本9.2開始,PostgreSQL支持本機JSON數據類型。它提供了許多用於操作JSON數據的函數和運算符。
CREATE TABLE orders ( ID serial NOT NULL PRIMARY KEY, info json NOT NULL );
該orders
表由兩列組成:
- 該
id
列是標識訂單的主鍵列。 - 該
info
列以JSON的形式存儲數據。
插入JSON數據
要將數據插入JSON列,您必須確保數據采用有效的JSON格式。以下INSERT
語句將新行插入orders
表中。
INSERT INTO orders (info) VALUES ( '{ "customer": "John Doe", "items": {"product": "Beer","qty": 6}}' );
這意味着John Doe
買了6
一瓶beers
。
讓我們同時插入多行。
INSERT INTO orders (info) VALUES ( '{ "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}}' );
查詢JSON數據
要查詢JSON數據,請使用該SELECT
語句,該語句類似於查詢其他本機數據類型:
SELECT info FROM orders;
PostgreSQL以JSON的形式返回結果集。
PostgreSQL提供了兩個本機運算符->
,->>
可幫助您查詢JSON數據。
- 運算符
->
按鍵返回JSON對象字段。 - 運算符
->>
按文本返回JSON對象字段。
以下查詢使用運算符->
以JSON的形式獲取所有客戶:
SELECT info -> 'customer' AS customer FROM orders;
以下查詢使用operator ->>
以文本形式獲取所有客戶:
SELECT info ->> 'customer' AS customer FROM orders;
因為->
運算符返回JSON對象,所以可以使用運算符->>
將其鏈接以檢索特定節點。例如,以下語句返回所有已售出的產品:
SELECT info -> 'items' ->> 'product' as product FROM orders ORDER BY product;
首先 info -> 'items'
將項目作為JSON對象返回。然后info->'items'->>'product'
將所有產品作為文本返回。
在WHERE子句中使用JSON運算符
我們可以使用JSON運算符in WHERE
子句來過濾返回的行。例如,要找出誰購買Diaper
,我們使用以下查詢:
SELECT info ->> 'customer' AS customer FROM orders WHERE info -> 'items' ->> 'product' = 'Diaper'
要了解誰一次購買兩種產品,我們使用以下查詢:
SELECT info ->> 'customer' AS customer, info -> 'items' ->> 'product' AS product FROM orders WHERE CAST ( info -> 'items' ->> 'qty' AS INTEGER ) = 2
請注意,我們使用類型轉換將qty
字段轉換為INTEGER
類型並將其與兩個進行比較。
將聚合函數應用於JSON數據
我們可以應用聚合函數如MIN,MAX,AVERAGE,SUM等,以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 orders
PostgreSQL JSON函數
PostgreSQL為我們提供了一些幫助您處理JSON數據的函數。
json_each函數
該json_each()
函數允許我們將最外層的JSON對象擴展為一組鍵值對。請參閱以下聲明:
SELECT json_each (info) FROM orders;
如果要將一組鍵值對作為文本,則使用該 json_each_text()
函數。
json_object_keys函數
要在最外層的JSON對象中獲取一組鍵,請使用該 json_object_keys()
函數。以下查詢返回列中嵌套items
對象的所有鍵info
SELECT json_object_keys (info->'items') FROM orders;
如果你想深入挖掘,還有更多的PostgreSQL JSON函數。
在本教程中,我們向您展示了如何使用PostgreSQL JSON數據類型。我們向您展示了一些最重要的JSON運算符和函數,可幫助您更有效地處理JSON數據。