MySQL JSON 数据类型

1. JSON 类型

MySQL 从版本 5.7 开始正式支持 JSON 类型
The JSON Data Type 文档 https://dev.mysql.com/doc/refman/8.0/en/json.html

1.1 操作符

->(箭头操作符)
从 JSON 字段中提取值

->>(双箭头操作符)
与 -> 类似,也是从 JSON 字段中提取值,但关键区别在于它会将提取出的标量值转换为文本字符串

2. JSON 类型查询

2.1 JSONObject

+------------------------------------------------------------------------+
|                                json1                            |
+------------------------------------------------------------------------+
| {"type": {"sta1": 1, "sta2": 2}, "express": 1, "official": 0}  |
+------------------------------------------------------------------------+
--  $ 表示当前 JSON 数据
select json1 -> '$.express' from boot_indicator;

-- 等价:JSON_EXTRACT(json1, '$.express')
-- 提取JSON值:JSON_EXTRACT(column, path)

2.2 JSONArray

+------------------------------------------------------------------------------------+
|      json2     |          json 3                        |
+------------------------------------------------------------------------------------+
|  [1001, 1002]  |    [{"age": 22, "name": "tinyspot"}, {"age": 20}]   |
+------------------------------------------------------------------------------------+
select json2 ->> '$[0]' from boot_indicator;
select json2 ->> '$[1]' from boot_indicator;
-- 输出:{"age": 22, "name": "tinyspot"}
select json2 ->> '$[0]' from boot_indicator;
-- 输出:22
select json2 ->> '$[0].age' from boot_indicator;

2.3 通配符查询

官方文档 https://dev.mysql.com/doc/refman/8.0/en/json.html
通配符 * 和 **

select JSON_EXTRACT(json1, '$.*') from boot_indicator;
-- 输出:[{"sta1": 1, "sta2": 2}, 1, 0]
select json1 -> '$.*' from boot_indicator;
-- 输出:[1, 2]
select json1 -> '$.type.*' from boot_indicator;
select JSON_EXTRACT(json2, '$[*]') from boot_indicator;
-- [{"age": 22, "name": "tinyspot"}, {"age": 20}]
select json2 ->> '$[*]' from boot_indicator;
-- [22, 20]
select json2 ->> '$[*].age' from boot_indicator where id = 1;

3. JSON 函数

文档 https://dev.mysql.com/doc/refman/8.3/en/json-function-reference.html

3.1 查询

select id, json1, json2 from boot_indicator
where json1 ->> '$.name' = 'tinyspot';

SELECT id, json1, json2 FROM boot_indicator
WHERE JSON_CONTAINS(json1, '"tinyspot"', '$.name');
select id, json1, json2 from boot_indicator
where json_contains(json2 ->> '$[*].name', '"tinyspot"');

补充:注意双引号
select CONCAT('"', 'demo' , '"'); 输出 "demo"

-- 参数形式:json1 -> '$.name' LIKE CONCAT('%', #{typeName}, '%')
select id, json1, json2 from boot_indicator
where json1 -> '$.name' LIKE CONCAT('%', 'tinyspot', '%');

3.2 检索函数 JSON_CONTAINS()

语法 JSON_CONTAINS(target, candidate[, path])
返回值:1(真) 0(假)

-- JSONArray: [1001, 1002]
select json2 -> '$[*]' from boot_indicator;
select JSON_CONTAINS(json2 ->> '$[*]', '1001') from boot_indicator;
select JSON_CONTAINS(json2 ->> '$[*]', json_array(1001)) from boot_indicator;
-- json1: {"num1": 100, "text5": [1001, 1002], "text6": "307269"}
select json_contains(json1 ->> '$.text5', '1001') from boot_indicator;
select json_contains(json1 ->> '$.text5', json_array(1001)) from boot_indicator;
select id, json1 from boot_indicator where json_contains(json1 ->> '$.text5', json_array(1001));
-- json2: [{"age": 22, "name": "tinyspot"}, {"age": 20}]
-- $[*].name:  ["tinyspot"]
select json2 ->> '$[*].name' from boot_indicator where id = 1;

select JSON_CONTAINS(json2 ->> '$[*].name', '"tinyspot"') from boot_indicator;
-- '$' 路径前缀,表示在整个 JSON 文档范围内进行搜索
-- select JSON_CONTAINS(json2 ->> '$[*].name', '"tinyspot"', '$') from boot_indicator;
-- select JSON_CONTAINS(json2, '"tinyspot"', '$[0].name') from boot_indicator;

-- 参数形式
-- select * from boot_indicator where id = 1001 and JSON_CONTAINS(data->'$[*].name', CONCAT('"', #{param}, '"'), '$');

3.3 json_object()

json_object() 创建JSON 对象

-- {"name": "tinyspot"}
select json_object('name', 'tinyspot')

-- 查询
select id, json1, json2 from boot_indicator
where JSON_CONTAINS(json1, JSON_OBJECT('name', 'tinyspot'));

3.4 json_array()

-- ["aaa", "bbb"]
select json_array('aaa', 'bbb');

update boot_indicator
set json1 = json_object('text5', json_array('aaa', 'bbb'))
where id = 4;

update boot_indicator
set json1 = json_set(json1, '$.text5', json_array('aaa', 'bbb'))
where id = 3;

4. JSON 更新

4.1 JSONObject 字段更新

update boot_indicator
set json1 = json_set(json1, '$.name', 'demo')
where id = 2;

-- 批量更新
update boot_indicator 
set json1 = case
                WHEN id = 1 THEN json_set(json1, '$.name', 'demo1')
                WHEN id = 2 THEN json_set(json1, '$.name', 'demo2')
             end
WHERE id IN (1, 2);

4.2 JSONArray 字段更新

update boot_indicator
set json2 = json_set(json2, '$[0].name', 'demo1')
where id = 2;

-- 批量更新
update boot_indicator
set json2 = case
               when id = 1 then json_set(json2, '$[0].name', 'demo1')
               when id = 2 then json_set(json2, '$[0].name', 'demo2')
            end
where id in (1, 2);
-- JSONArray 里添加一个 JSONObject
update boot_indicator
set json2 = json_array_append(json2, '$', JSON_OBJECT('name', 'aaa'))
where id = 2;

-- 批量更新
update boot_indicator
set json2 =
        case
            when id = 1 then json_array_append(json2, '$', JSON_OBJECT('name', 'tinyspot1'))
            when id = 2 then json_array_append(json2, '$', JSON_OBJECT('name', 'tinyspot2'))
        end
where id in (1, 2);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容