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


一、介绍


json 是对输入的完整拷贝,使用时再去解析,所以它会保留输入的空格,重复键以及顺序等。

jsonb是解析输入后保存的二进制,它在解析时会删除不必要的空格和重复的键,顺序和输入可能也不相同。使用时不用再次解析。

总结:

. json jsonb

推荐:使用 jsonb,且 jsonb 支持索引,和更多的运算符/函数

二、实践


1、定义


这里我们定义了姓名毕业院校两个字段

  1. CREATE TABLE "Students"
  2. (
  3. name VARCHAR(255),
  4. edu_experience JSONB
  5. )

2、插入


(1)Postgres SQL
  1. INSERT INTO "Students"
  2. ("edu_experience")
  3. VALUES
  4. (
  5. '{"name":"清华大学","year":{"type":"C.E.","value":2002},"remark":["985","211","一本"]}'
  6. )
(2)Sequelize

直接传 JSON 就好

3、取


第一种:直接取

  1. {"name": "清华大学", "year": {"type": "C.E.", "value": 2002}, "remark": ["985", "211", "一本"]}

第二种:深入取

(1)Postgres SQL
  1. -- 方法一
  2. -> json 对象
  3. SELECT "edu_experience"->'name' from "MemberTest" where "id" = 20
  4. -- "清华大学"
  5. ->> text
  6. SELECT "edu_experience"->>'name' from "MemberTest" where "id" = 20
  7. -- 清华大学
  8. -> + ->> text
  9. SELECT "edu_experience"->'year'->>'value' from "MemberTest" where "id" = 20
  10. -- 2002
  11. 补充:取数组中元素
  12. SELECT "edu_experience"->'remark'->>2 from "MemberTest" where "id" = 20
  13. -- 一本
  14. -- 方法二
  15. #> 取 json 对象
  16. SELECT "edu_experience"#>'{year,type}' from "MemberTest" where "id" = 20
  17. -- "C.E."
  18. #>> 取 text
  19. SELECT "edu_experience"#>>'{year,type}' from "MemberTest" where "id" = 20
  20. -- C.E.
  21. 补充:取数组中元素
  22. SELECT "edu_experience"#>>'{remark,2}' from "MemberTest" where "id" = 20
  23. -- 一本

推荐 #> 、#>> 的写法,更简洁一些。

(2)Sequelize
  1. await models.Student.findOne({
  2. attributes: [[models.sequelize.json("edu_experience.name"), "edu_exp_name"]]
  3. })

return:

  1. {
  2. "edu_exp_name": "清华大学"
  3. }

注:attributes: [models.sequelize.json("edu_experience.name")] 这种写法是不对的,必须给取出来的值 AS 重命名下

4、查询


(1)Postgres SQL

跟上面 3、取 差不多,不赘述了。

(2)Sequelize
  1. where: {
  2. "getEntBasicInfo.domain": "批发业",
  3. },

5、修改


(1)Postgres SQL
  1. 一、更新 json
  2. -- 表层值
  3. SELECT jsonb_set ( '{"name": "Jane", "contact": {"fax": "0000","phone": "01234567890"}}' :: jsonb, '{name}', '"colin"');
  4. -- 深入值
  5. SELECT jsonb_set ( '{"name": "Jane", "contact": {"fax": "0000","phone": "01234567890"}}' :: jsonb, '{contact,fax}', '"1111"');
  6. -- 数组中的元素
  7. SELECT jsonb_set ( '{"name": "Jane", "contact": {"fax": ["0000","1111","2222"],"phone": "01234567890"}}' :: jsonb, '{contact,fax,2}', '"1111"');
  8. -- 第四个参数为 TRUE:如果 key 不存在,添加 [默认]
  9. SELECT jsonb_set ( '{"name": "Jane", "contact": {"fax": "0000","phone": "01234567890"}}' :: jsonb, '{name}', '"colin"', TRUE);
  10. -- 第四个参数为 FALSE:如果 key 不存在,不添加
  11. SELECT jsonb_set ( '{"name": "Jane", "contact": {"fax": "0000","phone": "01234567890"}}' :: jsonb, '{age}', '18', FALSE);
  12. 二、删除 json
  13. -- 表层值
  14. SELECT '{"name": "James", "email": "james@localhost"}'::jsonb - 'email';
  15. -- 深入值
  16. SELECT '{"name": "James", "contact": {"phone": "01234 567890", "fax": "01987 543210"}}'::jsonb #- '{contact,fax}';

可以看到这边用的是上面介绍的 #> 、#>> 的取法

扩展:

1、如果是 json 中有多个值需要更新,如何合并到一句 sql 中?

  1. SET "getEntBasicInfo" =
  2. jsonb_set (
  3. jsonb_set (
  4. jsonb_set (
  5. jsonb_set (
  6. jsonb_set ( "getEntBasicInfo",
  7. '{contactWay,recommendTelephones}', '"推荐电话"' ),
  8. '{contactWay,recommendAddress}', '"推荐地址"' ),
  9. '{basicInfo,domain}', '"行业类别"' ),
  10. '{basicInfo,industryCode}', '"行业代码"' ),
  11. '{basicInfo,industry}','"所属行业"' )

2、如果是 json 中有多个值需要删除,如何合并到一句 sql 中?

  1. -- 表层值
  2. SELECT '{"name": "James", "age": 16, "email": "james@localhost"}' :: jsonb - 'email' - 'name';
  3. -- 深入值
  4. 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 类型的更多相关文章

  1. PostgreSQL 保存json,jsonb类型

    PostgresQL 字符串隐式转换JSON脚本: -- 隐式将varchar转换为json CREATE OR REPLACE FUNCTION json_in_varchar(varchar) R ...

  2. js 对象 / json / jsonb / jsonp 区别

    一.JSON vs JS 对象 1.区别 区别 Javascript 对象 Json 含义 对象的实例 一种数据格式(序列化格式) 传输 不能传输 可以跨平台传输,轻量级 格式 1.键不加引号.加单引 ...

  3. net.sf.json日期类型格式化输出

    net.sf.json 日期类型格式化输出 Date, Timestamp ; 编写工具类 package cn.jorcen.commons.util; import java.text.DateF ...

  4. postgresql jsonb类型查询

    select * from (select * from ud_order where user_id=10 and status=2unionselect * from ud_order where ...

  5. mysql json 使用 类型 查询 函数

    一,对记录的操作 1.创建有json字段的表 -- 创建表 ) , info JSON); 2.插入记录 -- 插入含有json数组的记录 , , "abc", NULL, TRU ...

  6. 为IIS添加json扩展类型文件的MiME类型

    IIS6.0 1.打开IIS添加Mime项 关联扩展名:*.json内容类型(MIME):application/x-javascript      2.添加映射: 位置在IIS对应站点右键属性:”主 ...

  7. JAVA下JSON的类型输出及使用

    JSON类型的输出: import java.util.ArrayList; import java.util.HashMap; import net.sf.json.JSONArray; impor ...

  8. Web API对application/json内容类型的CORS支持

    假设有一简单架构分为前后两部分,其一是Angular构成的前端页面站点,另一个则是通过ASP.NET Web API搭建的后端服务站点.两个站点因为分别布署,所有会有CORS(Cross-Origin ...

  9. 【python】re库 正则的一些过滤和把str拆分成list案例 以及json dict类型

    0x01: 部分参考:https://www.cnblogs.com/edwardsun/p/4421773.html match(string[, pos[, endpos]]) | re.matc ...

随机推荐

  1. python之面向对象篇6

    一.继承与派生 什么是继承 继承一种新建类的方式,新建的类称为子类或者派生类,被继承的类称为父类或基类或超类 子类会遗传父类的一系列属性 python支持多继承 注意: 在python3中,如果没有显 ...

  2. Win8.1无法安装更新,提示0x800*****错误的解决方法

    Win8.1无法安装更新,提示0x800*****错误的解决方法   注:本教程同样适用于Win10系统 有时候Win8.1某个系统文件的损坏会导致无法安装Windows更新,表现为Windows更新 ...

  3. 36、NSTimer使用详解-开启、关闭、移除

    1.要是用一个定时器,首先要定义一个定时器: @property(strong,nonatomic)NSTimer *myTimer;//定时器 2.初始化,初始化有两种方式: 第一种: + (NST ...

  4. 2018.06.27 POJ3281 Dining(最大流)

    Dining Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21578 Accepted: 9545 Description C ...

  5. win10 VMware ubuntu12.04 虚拟机不能上网【已解决】

    参考  :链接. 本机环境:Ubuntu 12.04 无线上网(连接手机热点). 主机:Win 10. 步骤1:VMware安装运行后,默认会有3个虚拟网络,VMnet0,VMnet1,VMnet8. ...

  6. GreenPlum 初始化配置报错:gpadmin-[ERROR]:-[Errno 12] Cannot allocate memory

    报错原因:可能swap太小或者没有交换分区 解决方法: (1)查看swap:swapon -s (2)如果什么都没有显示,说明你没有任何可用的swap,此时你可以添加1GB的swap: dd if=/ ...

  7. orika实现对象复制

    1.新建maven工程orika-demo,引入orika依赖,其中pom.xml如下 <?xml version="1.0" encoding="UTF-8&qu ...

  8. Linux四剑客find/grep/awk/sed

    find ./ -name "*txt" -maxdepth 1 -type f -mtime -2 -exec mv {} ./bbb.txt \; 这条命令表示找当前目录(-m ...

  9. js动态删除某一行,内容超出单元格后超出的部分用省略号代替

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <s ...

  10. chrome用type=file获取图片路径并转base64字符串

    1 html页面 <div class="col-sm-2" style="height: 200px;margin-top: 14px;"> &l ...