带有 mysql JSON 列的 IN 语句不起作用?
Posted
技术标签:
【中文标题】带有 mysql JSON 列的 IN 语句不起作用?【英文标题】:IN statement with mysql JSON column not working? 【发布时间】:2021-09-14 01:17:36 【问题描述】:我正在尝试在 json 列数据上查询 mysql 表,但未按预期工作
JSON_EXTRACT(data, \"$.STUDENT_NAME\") IN ('JASMINE','SAM')
JSON_EXTRACT(data, \"$.STUDENT_NAME\") IN ('JASMINE')
仅适用于数组中的一个元素,但不适用于数组中的多个元素,有什么想法吗?
完整查询
SELECT `data_uploads`.* FROM `data_uploads` WHERE `data_uploads`.`product_id` = 96 AND (dlname = 'STUDENT' AND JSON_EXTRACT(data, \"$.STUDENT_NAME\") IN ('JASMINE', 'SAM'))
预期结果
product_id: 96, dlname: "STUDENT", data: "CLASS"=>"GRADE-I", "GRAD_IMAGE"=>"jasmine_grad.jpg", "SECTION"=>"A", "STUDENT_IMAGE"=>"jasmine.jpg", "STUDENT_NAME"=>"JASMINE", created_at: "2021-06-18 10:16:56", updated_at: "2021-06-18 10:16:56"
product_id: 96, dlname: "STUDENT", data: "CLASS"=>"GRADE-I", "GRAD_IMAGE"=>"sam_grad.jpg", "SECTION"=>"A", "STUDENT_IMAGE"=>"sam.jpg", "STUDENT_NAME"=>"SAM", created_at: "2021-06-18 10:16:56", updated_at: "2021-06-18 10:16:56"
但是上面的查询返回一个空数组
Rails 活动记录查询:
DataUpload.where(product_id: 96).where("dlname = 'STUDENT' AND JSON_EXTRACT(data, '$.STUDENT_NAME') IN ('JASMINE','SAM')")
【问题讨论】:
显示样本数据和预期结果? @ysth 更新了查询和预期结果 为什么双引号前有反斜杠? 输出中的data
不是 JSON。
"CLASS"=>"GRADE-I", "GRAD_IMAGE"=>"jasmine_grad.jpg", "SECTION"=>"A", "STUDENT_IMAGE"=>"jasmine.jpg", "STUDENT_NAME"=>"JASMINE"
它不是 json
【参考方案1】:
在测试之前使用JSON_UNQUOTE()
删除值周围的引号。
SELECT *
FROM data_uploads
WHERE JSON_UNQUOTE(JSON_EXTRACT(data, "$.STUDENT_NAME")) IN ('JASMINE','SAM');
您还可以使用->>
速记来一次提取和取消引用。
SELECT *
FROM data_uploads
WHERE data->>"$.STUDENT_NAME" IN ('JASMINE','SAM');
【讨论】:
以上是关于带有 mysql JSON 列的 IN 语句不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
在 MYSQL 中使用 NOT IN 和 GROUP CONCAT
当所述列的值为 NULL 时,我在可空列上使用 JSON_extract 函数的 where 语句得到确认?