分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

Postgres 的 JSON / JSONB 类型

发布时间:2023-09-06 02:08责任编辑:白小东关键词:暂无标签

一、介绍


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" WHEREid = 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 productFROM ordersWHERE CAST ( info -> ‘items‘ ->> ‘qty‘ AS INTEGER ) = 2

注:我们使用类型转换CAST将 qty 字段转换为 INTEGER 类型并与 2 进行比较

参考资料:


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

Postgres 的 JSON / JSONB 类型

原文地址:https://www.cnblogs.com/xjnotxj/p/9416448.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved