Postgres 的 JSON / JSONB 類型
阿新 • • 發佈:2018-08-04
刪除 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 類型