Postgres 的 JSON / JSONB 类型
从 MySQL 5.7.8 开始,MySQL 支持原生的 JSON 数据类型。
一、介绍
json 是对输入的完整拷贝,使用时再去解析,所以它会保留输入的空格,重复键以及顺序等。
而jsonb是解析输入后保存的二进制,它在解析时会删除不必要的空格和重复的键,顺序和输入可能也不相同。使用时不用再次解析。
总结:
| . | json | jsonb |
|---|---|---|
| 存 | 快 | 慢 |
| 取 | 慢 | 快 |
推荐:使用 jsonb,且 jsonb 支持索引,和更多的运算符/函数
二、实践
1、定义
这里我们定义了姓名和毕业院校两个字段
CREATE TABLE "Students"
(
name VARCHAR(255),
edu_experience JSONB
)
2、插入
(1)Postgres SQL
INSERT INTO "Students"
("edu_experience")
VALUES
(
'{"name":"清华大学","year":{"type":"C.E.","value":2002},"remark":["985","211","一本"]}'
)
(2)Sequelize
直接传 JSON 就好
3、取
第一种:直接取
{"name": "清华大学", "year": {"type": "C.E.", "value": 2002}, "remark": ["985", "211", "一本"]}
第二种:深入取
(1)Postgres SQL
-- 方法一
-> 取 json 对象
SELECT "edu_experience"->'name' from "MemberTest" where "id" = 20
-- "清华大学"
->> 取 text
SELECT "edu_experience"->>'name' from "MemberTest" where "id" = 20
-- 清华大学
-> + ->> 取 text
SELECT "edu_experience"->'year'->>'value' from "MemberTest" where "id" = 20
-- 2002
补充:取数组中元素
SELECT "edu_experience"->'remark'->>2 from "MemberTest" where "id" = 20
-- 一本
-- 方法二
#> 取 json 对象
SELECT "edu_experience"#>'{year,type}' from "MemberTest" where "id" = 20
-- "C.E."
#>> 取 text
SELECT "edu_experience"#>>'{year,type}' from "MemberTest" where "id" = 20
-- C.E.
补充:取数组中元素
SELECT "edu_experience"#>>'{remark,2}' from "MemberTest" where "id" = 20
-- 一本
推荐 #> 、#>> 的写法,更简洁一些。
(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、查询
(1)Postgres SQL
跟上面 3、取 差不多,不赘述了。
(2)Sequelize
where: {
"getEntBasicInfo.domain": "批发业",
},
5、修改
(1)Postgres SQL
一、更新 json
-- 表层值
SELECT jsonb_set ( '{"name": "Jane", "contact": {"fax": "0000","phone": "01234567890"}}' :: jsonb, '{name}', '"colin"');
-- 深入值
SELECT jsonb_set ( '{"name": "Jane", "contact": {"fax": "0000","phone": "01234567890"}}' :: jsonb, '{contact,fax}', '"1111"');
-- 数组中的元素
SELECT jsonb_set ( '{"name": "Jane", "contact": {"fax": ["0000","1111","2222"],"phone": "01234567890"}}' :: jsonb, '{contact,fax,2}', '"1111"');
-- 第四个参数为 TRUE:如果 key 不存在,添加 [默认]
SELECT jsonb_set ( '{"name": "Jane", "contact": {"fax": "0000","phone": "01234567890"}}' :: jsonb, '{name}', '"colin"', TRUE);
-- 第四个参数为 FALSE:如果 key 不存在,不添加
SELECT jsonb_set ( '{"name": "Jane", "contact": {"fax": "0000","phone": "01234567890"}}' :: jsonb, '{age}', '18', FALSE);
二、删除 json
-- 表层值
SELECT '{"name": "James", "email": "james@localhost"}'::jsonb - 'email';
-- 深入值
SELECT '{"name": "James", "contact": {"phone": "01234 567890", "fax": "01987 543210"}}'::jsonb #- '{contact,fax}';
可以看到这边用的是上面介绍的 #> 、#>> 的取法
扩展:
1、如果是 json 中有多个值需要更新,如何合并到一句 sql 中?
SET "getEntBasicInfo" =
jsonb_set (
jsonb_set (
jsonb_set (
jsonb_set (
jsonb_set ( "getEntBasicInfo",
'{contactWay,recommendTelephones}', '"推荐电话"' ),
'{contactWay,recommendAddress}', '"推荐地址"' ),
'{basicInfo,domain}', '"行业类别"' ),
'{basicInfo,industryCode}', '"行业代码"' ),
'{basicInfo,industry}','"所属行业"' )
2、如果是 json 中有多个值需要删除,如何合并到一句 sql 中?
-- 表层值
SELECT '{"name": "James", "age": 16, "email": "james@localhost"}' :: jsonb - 'email' - 'name';
-- 深入值
SELECT '{"name": "James", "age": 16, "contact": {"phone": "01234 567890", "fax": "01987 543210"}}'::jsonb #- '{contact,fax}' #- '{age}';
(2)Sequelize
略
参考资料:
http://www.postgresqltutorial.com/postgresql-json/
Postgres 的 JSON / JSONB 类型的更多相关文章
- PostgreSQL 保存json,jsonb类型
PostgresQL 字符串隐式转换JSON脚本: -- 隐式将varchar转换为json CREATE OR REPLACE FUNCTION json_in_varchar(varchar) R ...
- js 对象 / json / jsonb / jsonp 区别
一.JSON vs JS 对象 1.区别 区别 Javascript 对象 Json 含义 对象的实例 一种数据格式(序列化格式) 传输 不能传输 可以跨平台传输,轻量级 格式 1.键不加引号.加单引 ...
- net.sf.json日期类型格式化输出
net.sf.json 日期类型格式化输出 Date, Timestamp ; 编写工具类 package cn.jorcen.commons.util; import java.text.DateF ...
- postgresql jsonb类型查询
select * from (select * from ud_order where user_id=10 and status=2unionselect * from ud_order where ...
- mysql json 使用 类型 查询 函数
一,对记录的操作 1.创建有json字段的表 -- 创建表 ) , info JSON); 2.插入记录 -- 插入含有json数组的记录 , , "abc", NULL, TRU ...
- 为IIS添加json扩展类型文件的MiME类型
IIS6.0 1.打开IIS添加Mime项 关联扩展名:*.json内容类型(MIME):application/x-javascript 2.添加映射: 位置在IIS对应站点右键属性:”主 ...
- JAVA下JSON的类型输出及使用
JSON类型的输出: import java.util.ArrayList; import java.util.HashMap; import net.sf.json.JSONArray; impor ...
- Web API对application/json内容类型的CORS支持
假设有一简单架构分为前后两部分,其一是Angular构成的前端页面站点,另一个则是通过ASP.NET Web API搭建的后端服务站点.两个站点因为分别布署,所有会有CORS(Cross-Origin ...
- 【python】re库 正则的一些过滤和把str拆分成list案例 以及json dict类型
0x01: 部分参考:https://www.cnblogs.com/edwardsun/p/4421773.html match(string[, pos[, endpos]]) | re.matc ...
随机推荐
- centos7 sqoop 1 搭建笔记
1.require : java环境,hadoop,hive ,mysql2.下载解压sqoop13.设置环境变量 export SQOOP_HOME=/data/spark/bin/sqoop ex ...
- 2019.01.02 NOIP训练 三七二十一(生成函数)
传送门 生成函数基础题. 题意简述:求由1,3,5,7,9这5个数字组成的n位数个数,要求其中3和7出现的次数都要是偶数. 考虑对于每个数字构造生成函数. 对于1,5,9:∑nxnn!=ex\sum_ ...
- 第15章 上下文管理器和else块
#<流流畅的Python>第15章 上下文管理器和else块 #15.1 先做这个,再做那个:if语句之外的else块 #else子句不仅能在if语句中使用,还能在for.while和tr ...
- js setInterval详解
[自己总结]: 语法 setInterval(code,interval) ①可以有第三个参数,第三个参数作为第一个参数(函数)的参数 ②第一个参数是函数,有三种形式: 1.传函数名,不用加引号,也 ...
- Jersey RESTful WebService框架学习(三)使用@QueryParam
介绍:@QueryParamuri路径请求参数写在方法的参数中,获得请求路径附带的参数.比如:@QueryParam("desc") String desc 前端控制 <!D ...
- Jersey RESTful WebService框架学习(一)
介绍:RESTful (Representation State Transfer) 描述了一个架构样式的网络系统,比如 web 应用程序.它首次出现在 2000 年 Roy Fielding 的博士 ...
- event based xml parser (SAX) demo
import java.io.ByteArrayInputStream; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SA ...
- VC6.0支持UNICODE的步骤
针对MFC程序的开发,支持Unicode一共需要三步: Step1 设置->C/C++预处理定义中,删除_MBCS,添加_UNICODE,UNICODE. Step2 设置->Link-& ...
- Visual Studio 2017快捷键
作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7048639.html Visual Studio 2017快捷键 Ctrl+ ...
- MessageFormat.format()和String.format()
MessageFormat 提供了以与语言无关方式生成连接消息的方式.使用此方法构造向终端用户显示的消息. MessageFormat 获取一组对象,格式化这些对象,然后将格式化后的字符串插入到模式中 ...