MySQL JSON 查询中的对象与数组技巧
目录
JSON 对象查询
1. JSON_CONTAINS
2. JSON_EXTRACT
3. JSON_TABLE
JSON 数组查询
1. JSON_CONTAINS
2. JSON_EXTRACT
3. JSON_TABL
MySQL 中 JSON 对象和 JSON 数组查询的详细介绍及带有 WHERE
条件的查询示例:
JSON 对象查询
1. JSON_CONTAINS
用于检查 JSON 对象是否包含指定的值或 JSON 对象。
-
语法:
JSON_CONTAINS(json_doc, val[, path])
-
示例: 假设有一个表
person
,其中有一个 JSON 列info
,存储了个人信息。CREATE TABLE person (id INT PRIMARY KEY,info JSON );INSERT INTO person (id, info) VALUES (1, '{"name": "张三", "age": 30}');
查询
info
列中name
为"张三"
的记录:SELECT * FROM person WHERE JSON_CONTAINS(info, '"张三"', '$.name');
如果
info
列中包含{"name": "张三"}
,则返回对应的行。
2. JSON_EXTRACT
用于从 JSON 对象中提取指定路径的值。
-
语法:
JSON_EXTRACT(json_doc, path)
-
示例: 查询
info
列中age
大于 25 的记录SELECT * FROM person WHERE JSON_EXTRACT(info, '$.age') > 25;
通过提取
age
的值并进行比较,筛选出符合条件的记录。
3. JSON_TABLE
将 JSON 对象转换为关系型表格,便于查询。
-
语法
JSON_TABLE(json_doc,path_expressionCOLUMNS(column_name column_type PATH json_path [on_empty] [on_error],...) ) [AS] alias
-
示例
SELECT * FROM person, JSON_TABLE(info,'$' COLUMNS(name VARCHAR(50) PATH '$.name',age INT PATH '$.age') ) AS jt WHERE jt.age > 25;
将
info
列中的 JSON 数据转换为表格格式,然后通过WHERE
条件筛选出age
大于 25 的记录。
JSON 数组查询
1. JSON_CONTAINS
同样适用于 JSON 数组,检查数组是否包含指定的值。
-
语法:
JSON_CONTAINS(json_array, val[, path])
-
示例: 假设有一个表
fruits
,其中有一个 JSON 列fruits_array
,存储了水果数组CREATE TABLE fruits (id INT PRIMARY KEY,fruits_array JSON );INSERT INTO fruits (id, fruits_array) VALUES (1, '["apple", "banana", "orange"]');
查询
fruits_array
列中包含"banana"
的记录SELECT * FROM fruits WHERE JSON_CONTAINS(fruits_array, '"banana"');
如果
fruits_array
中包含"banana"
,则返回对应的行。
2. JSON_EXTRACT
从 JSON 数组中提取指定索引的值。
-
语法:
JSON_EXTRACT(json_array, path)
-
示例: 查询
fruits_array
列中第二个水果为"banana"
的记录SELECT * FROM fruits WHERE JSON_EXTRACT(fruits_array, '$[1]') = '"banana"';
通过提取数组中索引为 1 的值并进行比较,筛选出符合条件的记录。
3. JSON_TABLE
将 JSON 数组转换为关系型表格。
-
语法
JSON_TABLE(json_doc,path_expressionCOLUMNS(column_name column_type PATH json_path [on_empty] [on_error],...) ) [AS] alias
-
示例
SELECT * FROM fruits, JSON_TABLE(fruits_array,'$[*]' COLUMNS(fruit VARCHAR(50) PATH '$') ) AS jt WHERE jt.fruit = 'banana';
将
fruits_array
列中的 JSON 数组转换为表格格式,然后通过WHERE
条件筛选出包含"banana"
的记录。