JSON_EXTRACT 数组
时间: 2025-01-06 09:29:27 浏览: 53
### 如何使用 `JSON_EXTRACT` 处理数组
#### MySQL 中的操作方法
在 MySQL 中,可以利用 `JSON_EXTRACT` 函数来访问存储于 JSON 数组内的元素。此函数允许通过路径表达式定位到具体的键或索引来检索所需的数据[^2]。
对于一个包含多个对象的 JSON 数组而言,可以通过指定数组下标的方式获取单个成员的信息:
```sql
SELECT JSON_UNQUOTE(JSON_EXTRACT(json_column, '$[0].property')) FROM table_name;
```
上述 SQL 语句展示了如何读取位于第一个位置的对象里名为 "property" 的属性值,并且应用了 `JSON_UNQUOTE()` 去除多余的引号以便更直观地查看结果[^4]。
如果想要筛选满足一定条件的记录,则可以在 WHERE 子句中加入相应的逻辑判断:
```sql
SELECT * FROM students
WHERE CAST(JSON_EXTRACT(scores, '$[*].score') AS DECIMAL(10 , 2 )) >= 85 ;
```
这里假设 scores 列保存了一个由分数组成的 JSON 数组;该查询会返回所有平均成绩不低于85分的学生信息。
#### PostgreSQL 中的操作方式
而在 PostgreSQL 当中,虽然也有类似的机制支持对 JSON 类型字段执行类似操作,但是具体实现略有不同。通常情况下推荐采用箭头运算符 (`->`, `->>`) 或者点记法直接作用于目标列上以简化书写过程[^3]。
当面对较为复杂的嵌套结构时,可能需要用到专门设计用来解析深层级节点内容的方法——比如 `jsonb_array_elements()` 可迭代展开整个集合供进一步分析处理[^1]。
例如下面这段代码片段说明了怎样查找那些至少拥有一门课程得分超过90分的同学名单:
```sql
WITH unnested_scores AS (
SELECT student_id,
(scores ->> 'courseName')::text as course_name,
(scores ->> 'grade')::decimal as grade
FROM students,
LATERAL jsonb_array_elements(students.courses) courses(scores))
SELECT DISTINCT s.*
FROM students s
JOIN unnested_scores us ON s.id = us.student_id
WHERE us.grade > 90;
```
在这个例子当中,先创建了一个临时视图 `unnested_scores` 来表示每位同学所修各科目的名称及其对应的评分情况;接着再基于这个中间产物完成最终过滤工作。
阅读全文
相关推荐


















