Postgres 的 JSON / JSONB 类型
Posted 小蒋不素小蒋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Postgres 的 JSON / JSONB 类型相关的知识,希望对你有一定的参考价值。
一、介绍
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 类型的主要内容,如果未能解决你的问题,请参考以下文章