Postgres 的 JSON / JSONB 类型

从 MySQL 5.7.8 开始,MySQL 支持原生的 JSON 数据类型。


一、介绍


json是对输入的完整拷贝,使用时再去解析,所以它会保留输入的空格,重复键以及顺序等。而jsonb是解析输入后保存的二进制,它在解析时会删除不必要的空格和重复的键,顺序和输入可能也不相同。使用时不用再次解析。

总结:

.jsonjsonb

二、实践


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/

转载于:https://www.cnblogs.com/xjnotxj/p/9416448.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值