从 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 类型的更多相关文章

  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. shell入门练习

    **定义局部变量, 局部变量在退出Shell客户端时会失效** **单引号:原样输出** **双引号:如果里面有变量,会输出变量** **没有引号:输出变量** 可以在调用脚本的时候给脚本传递参数,脚 ...

  2. 68.iOS设备尺寸及型号代码(iPhoneXR/XS)

    所有设备型号官网地址: https://www.theiphonewiki.com/wiki/Models iPhone: 机型 像素 比例 像素密度 屏幕尺寸 机型代码 发布日期 iPhone 2g ...

  3. socketserver实例化过程

    一.创建server对象时__init__的执行 找继承中的__init__ 这是ThreadingMixIn类中的方法 这是TCPServer类中的方法(父类BaserServer中还会用到fini ...

  4. oracle 导出表

    由于进项目组是跟着dba做事情的,但是没做多久dba走了,差不多就把数据库方面的“杂事”接下来了. 小白一个,只有敬小慎微的操作.经常看到的高水位和低水位的情况,也不敢去乱动. 搞好今天晚上需要跑数据 ...

  5. yii2 控制器渲染

    render() : 渲染一个 视图名并使用一个 布局返回到渲染结果. renderPartial() : 渲染一个 视图名并且不使用布局. renderAjax() : 渲染一个 视图名并且不使用布 ...

  6. Codeforces Round #538 (Div. 2) E 随机数生成

    https://codeforces.com/contest/1114/problem/E 题意 交互题,需要去猜一个乱序的等差数列的首项和公差,你能问两种问题 1. 数列中有没有数比x大 2. 数列 ...

  7. Win7 VS2015环境编译Libpng

    第3次编译Libpng依然想不起任何东西,为了不浪费第4次的时间... http://libpng.com/pub/png/libpng.html http://www.zlib.net/ 解压两个压 ...

  8. IntelliJ IDEA 2017版 spring-boot 2.0.3 部署war包项目和jar包项目

    1.建立项目 Java Controller package com.springboot.jsp.controller; import org.springframework.stereotype. ...

  9. HDU 1079 Calendar Game (博弈或暴搜)

    题意:给定一个日期,然后 A 和 B 双方进行操作,谁先把日期变成2001年11月04日,将获胜,如果超过该日期,则输了,就两种操作. 第一种:变成下一天,比如现在是2001.11.3 变成 2001 ...

  10. Arria10中PHY的时钟线结构

    发送器时钟网络由发送器PLL到发送器通道,它为发送器提供两种时钟 高速串行时钟——串化器的高速时钟 低速并行时钟——串化器和PCS的低速时钟 在绑定通道模式,串行和并行时钟都是由发送器的PLL提供给发 ...