写点什么

MySQL 的 Json 类型个人用法详解

作者:北桥苏
  • 2023-09-04
    广东
  • 本文字数:859 字

    阅读完需:约 3 分钟

前言


虽然 MySQL 很早就添加了 Json 类型,但是在业务开发过程中还是很少设计带这种类型的表。少不代表没有,当真正要对 Json 类型进行特定查询,修改,插入和优化等操作时,却感觉一下子想不起那些函数怎么使用。比如把 json 里的某个键和值作为 SQL 条件,修改某个键下的子键的值,其中可能会遇到数组形式的 Json 或者键名是字符串的数字修改异常等问题。那么,以下是小北在业务中常遇到的 Json 类型操作汇总了。

 

查询


1. 查询普通键


以下示例是从 goods 表的 price 字段里取出 price 键的值,可以依次往下取值,就是 price.嵌套键名即可。

select json_extract(price, "$.price") as de from goods where id = 159540
复制代码


2. 查询字符串类型的数字键


虽然以上能解决大部分取值,但有时候的 json 嵌套里有字符串类型的数字键名,如下图的 json,要取出字段下 sku 键名的 "45453"键 algorithm 的值。


select json_extract(price, "$.sku.\"45453\".algorithm") as de from price where id = 159540
复制代码


3. 查询数组类的 Json 指定值


以上的两种是我们常见的对象类,但当出现数组类时,就没有键名了,取值只需要指定索引即可,如下分别是查询某值和根据 json 的某值作为查询条件。

select JSON_EXTRACT(`crumbs`, $[1]) as one_crumbs from comment where id = 4565
复制代码


select * from comment where JSON_EXTRACT(`crumbs` ,'$[1]') = 256
复制代码


4. 查询 Json 里是否包含某个值


select * from goods_item where goods_id=10263 and JSON_CONTAINS(item_value->'$', concat(43318,''));
复制代码


select * from goods_item where goods_id=10263 and JSON_CONTAINS(item_value, concat(43318,''));
复制代码


select * from goods_item where goods_id=10263 and JSON_CONTAINS(item_value, concat(43318,''),'$');
复制代码


5. 查询 Json 长度


以下的 goods_img 是一个数组类的 Json 字段,通过长度作为 SQL 的查询条件。

select id, stock_no, goods_img from goods_item where state = 1 and JSON_LENGTH(goods_img) < 3
复制代码


更新


1. 修改 Json 字段下指定键的值


update price set price = json_set(price, "$.attr.\"1280\".price_old", 300) where id in (171314)
复制代码



用户头像

北桥苏

关注

公众号:ZERO开发 2023-05-08 加入

专注后端实战技术分享,不限于PHP,Python,JavaScript, Java等语言,致力于给猿友们提供有价值,有干货的内容。

评论

发布
暂无评论
MySQL的Json类型个人用法详解_北桥苏_InfoQ写作社区