PostgreSQL JSON 處理


 

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數據的函數和運算符。

讓我們開始創建一個  用JSON數據類型練習的新表

CREATE TABLE orders (

ID serial NOT NULL PRIMARY KEY,

info json NOT NULL

);

orders表由兩列組成:

  1. 該  id 列是標識訂單的主鍵列。
  2. 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的形式返回結果集。

PostgreSQL提供了兩個本機運算符->->>可幫助您查詢JSON數據。

  • 運算符->按鍵返回JSON對象字段。
  • 運算符->>按文本返回JSON對象字段。

以下查詢使用運算符->以JSON的形式獲取所有客戶:

SELECT

info -> 'customer' AS customer

FROM

orders;

postgresql JSON本機運算符

以下查詢使用operator ->>以文本形式獲取所有客戶:

SELECT

info ->> 'customer' AS customer

FROM

orders;

postgresql json文本運算符

因為->運算符返回JSON對象,所以可以使用運算符->>將其鏈接以檢索特定節點。例如,以下語句返回所有已售出的產品:

SELECT

info -> 'items' ->> 'product' as product

FROM

orders

ORDER BY

product;

postgresql json運算符鏈

首先   info -> 'items'將項目作為JSON對象返回。然后info->'items'->>'product'將所有產品作為文本返回。

在WHERE子句中使用JSON運算符

我們可以使用JSON運算符in WHERE子句來過濾返回的行。例如,要找出誰購買Diaper,我們使用以下查詢:

SELECT

info ->> 'customer' AS customer

FROM

orders

WHERE

info -> 'items' ->> 'product' = 'Diaper'

postgresql json opeartor在where子句中

要了解誰一次購買兩種產品,我們使用以下查詢:

SELECT

info ->> 'customer' AS customer,

info -> 'items' ->> 'product' AS product

FROM

orders

WHERE

CAST (

info -> 'items' ->> 'qty' AS INTEGER

) = 2

postgresql json運算符在where子句中強制轉換

請注意,我們使用類型轉換將qty字段轉換為INTEGER 類型並將其與兩個進行比較。

將聚合函數應用於JSON數據

我們可以應用聚合函數MINMAXAVERAGESUM等,以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函數

PostgreSQL為我們提供了一些幫助您處理JSON數據的函數。

json_each函數

json_each()函數允許我們將最外層的JSON對象擴展為一組鍵值對。請參閱以下聲明:

 

SELECT

json_each (info)

FROM

orders;

 

postgresql json json_each函數

如果要將一組鍵值對作為文本,則使用該  json_each_text()函數。

json_object_keys函數

要在最外層的JSON對象中獲取一組鍵,請使用該  json_object_keys() 函數。以下查詢返回列中嵌套items對象的所有鍵info

SELECT

json_object_keys (info->'items')

FROM

orders;

postgresql json_object_keys函數

如果你想深入挖掘,還有更多的PostgreSQL JSON函數

在本教程中,我們向您展示了如何使用PostgreSQL JSON數據類型。我們向您展示了一些最重要的JSON運算符和函數,可幫助您更有效地處理JSON數據。

參考:https://www.cnblogs.com/my4piano/p/5658264.html

          https://blog.csdn.net/xfg0218/article/details/83182203


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM