如何在MySQL中对JSON数据而非表字段应用WHERE条件?
解决方案
要从JSON数组中筛选出isPastDue和isPrinted均为false的节点并提取dueDate,可以使用JSON_TABLE函数将JSON数组转换为关系型表结构,之后就能像普通表字段一样添加WHERE条件筛选。
完整查询语句
SELECT CONCAT(cd.FirstName, ' ', cd.LastName) AS CustomerName, jt.dueDate FROM test.customerData cd INNER JOIN test.customerbills sb ON cd.customerCode = sb.customerCode JOIN JSON_TABLE( sb.BillData, '$[*]' COLUMNS ( isPastDue BOOLEAN PATH '$.isPastDue', isPrinted BOOLEAN PATH '$.isPrinted', dueDate DATE PATH '$.dueDate' ) ) jt ON jt.isPastDue = FALSE AND jt.isPrinted = FALSE;
关键说明
- JSON_TABLE的作用:
$[*]表示遍历JSON数组中的每一个元素,将每个节点的isPastDue、isPrinted、dueDate提取为对应的列。 - 数据类型匹配:直接用布尔值
FALSE匹配,不需要加引号——JSON中的布尔值在MySQL中会被解析为BOOLEAN类型,用字符串'false'匹配会导致类型不匹配,进而返回null。 - 简化查询结构:无需嵌套子查询,直接通过JOIN关联JSON_TABLE生成的临时表,同时在JOIN条件中筛选符合要求的节点。
原尝试无效的原因
- 未遍历JSON数组:直接用
$.dueDate只能提取单个对象的字段,但BillData是数组结构,无法直接定位到元素。 - 类型不匹配:用字符串
'false'匹配JSON布尔值false,导致条件不成立,最终返回null。
内容的提问来源于stack exchange,提问作者Harry R
相关产品推荐
相关产品推荐

