1. 程式人生 > >Postgres 的 JSON / JSONB 類型

Postgres 的 JSON / JSONB 類型

刪除 ttr 順序 再次 custom 使用 二進制 sql insert

一、介紹


json是對輸入的完整拷貝,使用時再去解析,所以它會保留輸入的空格,重復鍵以及順序等。而jsonb是解析輸入後保存的二進制,它在解析時會刪除不必要的空格和重復的鍵,順序和輸入可能也不相同。使用時不用再次解析。

總結:

. json jsonb

二、實踐


1、定義


這裏我們定義了姓名畢業院校兩個字段

CREATE TABLE "Students"
(
   name VARCHAR(255),
   edu_experience JSON
)

2、插入


(1)Postgres SQL
INSERT INTO "Students"
VALUES
(
    ‘colin‘,
    ‘{"name":"清華大學","year":"2000","remark":"難忘的經歷"}‘
)
(2)Sequelize

{"name":"清華大學","year":"2000","remark":"難忘的經歷"}

3、取


第一種:全部取

"edu_experience": {
    "name": "清華大學",
    "year": "2000",
    "remark": "難忘的經歷"
}

第二種:深入取

(1)Postgres SQL

a.return "清華大學"(帶雙引號)

SELECT
"edu_experience"->‘name‘
FROM
 "Students" 
 WHERE
 id = 152

b.return 清華大學(不帶雙引號)

SELECT
"edu_experience"->>‘name‘
FROM
"Students" 
WHERE
id = 152

註:->返回 JSON 對象,->>返回文本,若在一個嵌套對象中,如 edu_experience 字段的值為對象:

{
    "info": {
        "items" : {
            "product" : "xxx"
        }
    } 
}

取出 xxx 的寫法為:

SELECT
"edu_experience" -> ‘info‘ -> ‘items‘ ->> ‘product‘ 
FROM
 "Students" 
(2)Sequelize
await models.Student.findOne({ 
    attributes: [[models.sequelize.json("edu_experience.name"), "edu_exp_name"]]
})

return:

{
    "edu_exp_name": "清華大學"
}

註:attributes: [models.sequelize.json("edu_experience.name")] 這種寫法是不對的,必須給取出來的值 AS 重命名下

4、查詢


基礎查詢懶得說了

[拓展]

CAST

例如:要算出誰一次購買了兩種產品?

SELECT
 info ->> ‘customer‘ AS customer,
 info -> ‘items‘ ->> ‘product‘ AS product
FROM
 orders
WHERE
 CAST (
 info -> ‘items‘ ->> ‘qty‘ AS INTEGER
 ) = 2

註:我們使用類型轉換CAST將 qty 字段轉換為 INTEGER 類型並與 2 進行比較

參考資料:


http://www.postgresqltutorial.com/postgresql-json/

Postgres 的 JSON / JSONB 類型