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

如何在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;

关键说明

  1. JSON_TABLE的作用:$[*]表示遍历JSON数组中的每一个元素,将每个节点的isPastDue、isPrinted、dueDate提取为对应的列。
  2. 数据类型匹配:直接用布尔值FALSE匹配,不需要加引号——JSON中的布尔值在MySQL中会被解析为BOOLEAN类型,用字符串'false'匹配会导致类型不匹配,进而返回null。
  3. 简化查询结构:无需嵌套子查询,直接通过JOIN关联JSON_TABLE生成的临时表,同时在JOIN条件中筛选符合要求的节点。

原尝试无效的原因

  • 未遍历JSON数组:直接用$.dueDate只能提取单个对象的字段,但BillData是数组结构,无法直接定位到元素。
  • 类型不匹配:用字符串'false'匹配JSON布尔值false,导致条件不成立,最终返回null。

内容的提问来源于stack exchange,提问作者Harry R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:03:07