从 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

参考资料:

mysql postgres json_Postgres 的 JSON / JSONB 类型相关推荐

  1. 10.数据类型-json/jsonb类型

    文章目录 前言 一.json/jsonb类型 1.json类型简介 2.查询json数据 3.jsonb与json差异 4.jsonb与json操作符 5.jsonb与json函数 6.jsonb键/ ...

  2. json和jsonb类型——PostgreSQL

    PostgreSQL支持两种json数据类型:json和jsonb,而两者唯一的区别在于效率,json是对输入的完整拷贝,使用时再去解析,所以它会保留输入的空格,重复键以及顺序等.而jsonb是解析输 ...

  3. mysql修改虚拟列属性失败_mysql虚拟列(Generated Columns)及JSON字段类型的使用

    mysql 5.7中有很多新的特性,但平时可能很少用到,这里列举2个实用的功能:虚拟列及json字段类型 一.先创建一个测试表: drop table if exists t_people; CREA ...

  4. mysql虚拟列(Generated Columns)及JSON字段类型的使用

    mysql 5.7中有很多新的特性,但平时可能很少用到,这里列举2个实用的功能:虚拟列及json字段类型 一.先创建一个测试表: 1 2 3 4 5 6 7 8 9 drop table  if ex ...

  5. Postgres中jsonb类型

    Jsonb类型 PostgresSql支持两种JSON数据类型:json和jsonb.json类型以文本形式存储json对象,输入的文本是什么样的,存储的文本就是什么样的.每次处理时需要解析和分析文本 ...

  6. mysql+json+ciud_mysql 5.7 json 字段类型查找、修改

    修改 json 里的数组字段 mysql> set @json = '{"test": [{"name": "laravel"}, { ...

  7. MySQL——JSON_REPLACE()函数修改JSON属性值

    引言 由于对mysql的函数并不了解,之前遇到了一个场景: mysql表中有一个字段res_content 是一个由longtext类型(可以理解为一个更长的varchar)保存的巨大的JSON对象, ...

  8. MySQL 5.7原生JSON格式支持

    在MySQL与PostgreSQL的对比中,PG的JSON格式支持优势总是不断被拿来比较.其实早先MariaDB也有对非结构化的数据进行存储的方案,称为dynamic column,但是方案是通过BL ...

  9. mysql数字_MySQL 中的数字类型

    MySQL 中数据类型常用的就三大类: 数字类型/numeric types 日期和时间/date and time types 字符类型/string (character and byte) ty ...

最新文章

  1. Keras Bug 解决方法 Exception ignored in: bound method BaseSession.__del__ of
  2. 2.5亿存款丢失案储户6问质疑工行 句句戳痛点
  3. Cordova创建你的第一个App
  4. ORACLE数据库的备份和还原。
  5. 令新手头痛的java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet错误...
  6. matlab百分制到5分制的转换,绩点换算百分制(绩点5分制百分对照表)
  7. mysql磁盘占用太大无法删除_mysql的binlog太大太多占用大量磁盘的解决
  8. python_四元数q转旋转矩阵R(已验证)
  9. putty远程linux系统时间修改,使用putty远程linux服务
  10. html圈c为什么显示问号,朋友圈中能翻译变文字的“问号”是怎么回事?
  11. SSD-tensorflow Windows环境下,mAP的计算
  12. Photoshop:如何使图片覆盖在文字上以及一种海报效果实现
  13. android游戏工作心得体会,幼儿园游戏的心得体会(精选6篇)
  14. win10网络 计算机终止,win7换win10系统总是断网的几种原因和解决方法
  15. 北京大学肖臻老师《区块链技术与应用》公开课笔记8——BTC挖矿篇
  16. MATLAB 彩色图转灰色图处理
  17. Jquery给HTML元素绑定按键事件-回车事件
  18. Rancher2.0与DataDog集成部署
  19. 笔记本电脑用久了卡顿解决方法
  20. ncist网络空间安全专业护网方向认知实习笔记2021.12 DAY1.2

热门文章

  1. 分享一款很好用的打印软件:小灰狼快递单打印软件v928
  2. Java生成二维码以及解码
  3. 东华大学计算机复试难度,东华大学计算机复试回忆
  4. 多门店VIP会员卡管理营销服务小程序开发
  5. 如何检测应用帧率-FPS测试
  6. 简述基于89c51的8*8LED点阵屏使用方法
  7. Sonar安装与配置
  8. 【摘要干】如何执飞前写商业计划?
  9. 没想到H5也是黑灰产的攻击重点?
  10. 关于Fielding博士论文导读