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

如何通过一个表的JSON数组值查询另一表的匹配数据行?

用JSON函数实现跨表数组匹配查询

你需要从report_templates表中查询与reader_templates表指定JSON数组值匹配的行,不用字符串替换的方式,直接用原生JSON函数更靠谱,以下是两种场景的实现:

1. 匹配ckeditor_templates数组中的值

方法一:用JSON_CONTAINS直接判断(简洁高效)

SELECT rt.*
FROM report_templates rt, reader_templates rd
WHERE rd.reader_id = '0001'
  AND JSON_CONTAINS(rd.ckeditor_templates, JSON_QUOTE(rt.radreport_id));

JSON_QUOTE用来把radreport_id转成JSON字符串格式,确保和数组内的元素格式一致,JSON_CONTAINS直接检查该值是否存在于JSON数组中。

方法二:用JSON_TABLE将数组转成行后关联(适合复杂场景)

如果需要对数组元素做额外处理,或者数据库版本支持的话,可以把JSON数组拆成多行再关联:

SELECT rt.*
FROM report_templates rt
JOIN reader_templates rd
  ON EXISTS (
    SELECT 1
    FROM JSON_TABLE(rd.ckeditor_templates, '$[*]' COLUMNS (template_code VARCHAR(255) PATH '$')) jt
    WHERE jt.template_code = rt.radreport_id
  )
WHERE rd.reader_id = '0001';

2. 匹配radreports_templates数组中的值

把上面查询里的ckeditor_templates换成radreports_templates即可,两种方法同理:

简洁版(JSON_CONTAINS)

SELECT rt.*
FROM report_templates rt, reader_templates rd
WHERE rd.reader_id = '0001'
  AND JSON_CONTAINS(rd.radreports_templates, JSON_QUOTE(rt.radreport_id));

数组转行版(JSON_TABLE)

SELECT rt.*
FROM report_templates rt
JOIN reader_templates rd
  ON EXISTS (
    SELECT 1
    FROM JSON_TABLE(rd.radreports_templates, '$[*]' COLUMNS (report_id VARCHAR(255) PATH '$')) jt
    WHERE jt.report_id = rt.radreport_id
  )
WHERE rd.reader_id = '0001';

为什么不用REPLACE的方式?

之前用字符串替换拆分JSON数组的方法风险很高,如果数组内的元素包含[、]或者逗号这类字符,会直接导致WHERE IN语法错误,或者匹配到错误的值。用原生JSON函数是直接操作JSON结构,完全不会有这类问题,兼容性和稳定性都更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:35:17