You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WHERE子句中使用JSON数组列作为查询条件

基于JSON数组字段筛选数据的解决方案

不同数据库对JSON数组的查询语法存在差异,以下是主流数据库的具体实现方式:

SQL Server

你尝试的JSON_VALUE写法可正常生效,但需注意显式数据类型转换——JSON_VALUE默认返回字符串类型,直接与数字比较可能触发不符合预期的隐式转换,修正后的语句:

SELECT * 
FROM student 
WHERE CAST(JSON_VALUE(marks, '$.0.marks') AS INT) > 4

若数组包含多个元素,需筛选任意元素满足条件的行,可通过OPENJSON展开数组后判断:

SELECT s.*
FROM student s
CROSS APPLY OPENJSON(s.marks) WITH (marks INT '$.marks') j
WHERE j.marks > 4
GROUP BY s.ID, s.Students, s.Date, s.marks

MySQL

使用JSON_EXTRACT或简化的->>操作符提取JSON值,同样需显式转换类型:

SELECT * 
FROM student 
WHERE JSON_UNQUOTE(JSON_EXTRACT(marks, '$[0].marks')) + 0 > 4
-- 更简洁的写法
SELECT * 
FROM student 
WHERE marks->>'$[0].marks' + 0 > 4

处理多元素数组时,借助JSON_TABLE展开筛选:

SELECT s.*
FROM student s
JOIN JSON_TABLE(
    s.marks,
    '$[*]' COLUMNS(marks INT PATH '$.marks')
) j
WHERE j.marks > 4
GROUP BY s.ID, s.Students, s.Date, s.marks

PostgreSQL

通过->>提取文本后转换为整数类型:

SELECT * 
FROM student 
WHERE (marks->0->>'marks')::INT > 4

针对多元素数组,使用jsonb_array_elements展开去重:

SELECT DISTINCT s.*
FROM student s
JOIN jsonb_array_elements(s.marks::jsonb) j
WHERE (j->>'marks')::INT > 4

你最初的语句未生效,大概率是隐式类型转换导致的异常,显式转换数据类型后即可正确筛选出目标行。

内容的提问来源于stack exchange,提问作者Manigandan Max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 00:25:28