着重介绍一下sql语句中的JSON_UNQUOTE、JSON_EXTRACT

问题:解释一下下面这句sql并着重介绍一下JSON_UNQUOTE、JSON_EXTRACT。

mysql 复制代码
SELECT
  COUNT( 1 ) AS `cnt` 
FROM
  `t_production_line_model` `model` 
WHERE
  JSON_UNQUOTE(
  JSON_EXTRACT( `model`.`toolLib`, '$.rackId' )) = 6
-- PARAMETERS: ["6"] 

这条 SQL 的含义是:

查询表 t_production_line_model 中字段 toolLib 的 JSON 数据中,键为 rackId 的值为 "6"(字符串)或 6(数字)的记录数量。


🧠 SQL 语句详解:

mysql 复制代码
SELECT COUNT(1) AS `cnt`
FROM `t_production_line_model` `model`
WHERE JSON_UNQUOTE(JSON_EXTRACT(`model`.`toolLib`, '$.rackId')) = 6
部分 解释
COUNT(1) AS cnt 统计满足条件的记录数量,起别名为 cnt
FROM t_production_line_model model 查询的表是 t_production_line_model,别名为 model
JSON_EXTRACT(toolLib, '$.rackId') toolLib 字段这个 JSON 字符串中提取键 "rackId" 对应的值
JSON_UNQUOTE(...) 将提取的 JSON 值去除引号,使之变成普通 SQL 比较值
= 6 判断 JSON 中 "rackId" 的值是否等于数字 6
参数值:["6"] 表示执行时传入的参数为字符串 "6",在对比时可能涉及类型转换

🔍 重点解析两个函数

JSON_EXTRACT(json_doc, path)

作用 :从 JSON 字段中提取指定路径的值 语法

mysql 复制代码
JSON_EXTRACT(json_doc, '$.key')
JSON_EXTRACT(json_doc, '$[index]')

示例

mysql 复制代码
-- JSON 示例: {"rackId": 6, "toolIds": [1,2,3]}
JSON_EXTRACT('{"rackId":6}', '$.rackId') -- 返回 6(JSON 类型,带类型信息)
JSON_EXTRACT('{"toolIds":[1,2,3]}', '$.toolIds[1]') -- 返回 2
  • 返回值是 JSON 类型(比如 "6"truenull,带双引号的是字符串)
  • 如果路径找不到,返回 NULL

JSON_UNQUOTE(json_val)

作用 :将 JSON 格式的字符串值(如 "6")去掉引号变成普通值(如 6),便于和 SQL 值做比较 语法

mysql 复制代码
JSON_UNQUOTE(JSON_EXTRACT(...))

示例

mysql 复制代码
JSON_UNQUOTE('"hello"') → hello
JSON_UNQUOTE('6') → 6

🧪 参数比较说明

你 SQL 中的比较是:

mysql 复制代码
JSON_UNQUOTE(JSON_EXTRACT(toolLib, '$.rackId')) = 6

但传入的是参数:

mysql 复制代码
["6"]

也就是:

mysql 复制代码
... = "6"
  • 如果 rackId 是字符串 "6",这句能匹配;
  • 如果 rackId 是数字 6,MySQL 也能进行隐式类型转换匹配;
  • 不过推荐使用参数占位符:
mysql 复制代码
... = ?

避免类型不一致的问题(建议和数据保持类型一致,"6" vs 6)。


✅ 总结

函数 作用 返回值类型 用途
JSON_EXTRACT(json, path) 提取 JSON 字段中的值 JSON 类型(可能带引号) 定位 JSON 中的数据
JSON_UNQUOTE(json_val) 去除 JSON 中的字符串引号 普通字符串或数值 用于 SQL 比较

💡 最佳实践建议:

如果你确定 rackId 是数字类型,写法应更明确:

mysql 复制代码
WHERE CAST(JSON_UNQUOTE(JSON_EXTRACT(toolLib, '$.rackId')) AS UNSIGNED) = ?

或者确保传入参数的类型与 JSON 中一致,避免隐式类型转换带来的问题。

如需,我也可以根据你实际 toolLib 的 JSON 结构,帮你设计更安全高效的查询方式。

相关推荐
黄焖鸡能干四碗3 分钟前
智慧教育,智慧校园,智慧安防学校建设解决方案(PPT+WORD)
java·大数据·开发语言·数据库·人工智能
敲上瘾7 分钟前
Docker 存储卷(Volume)核心概念、类型与操作指南
linux·服务器·数据库·docker·容器·架构
DemonAvenger15 分钟前
MySQL内存优化:缓冲池与查询缓存调优实战指南
数据库·mysql·性能优化
RationalDysaniaer20 分钟前
了解etcd
数据库·etcd
正在走向自律33 分钟前
国产时序数据库选型指南-从大数据视角看透的价值
大数据·数据库·清华大学·时序数据库·iotdb·国产数据库
Pocker_Spades_A34 分钟前
Python快速入门专业版(十五):数据类型实战:用户信息录入程序(整合变量、输入与类型转换)
数据库·python
禁默1 小时前
已知 inode 号,如何操作文件?Ext 文件系统增删查改底层逻辑拆解
linux·服务器·数据库
云飞云共享云桌面1 小时前
工厂办公环境如何实现一台服务器多人共享办公
运维·服务器·网络·数据库·3d
weixin_456904271 小时前
MySQL高级特性详解
数据库·mysql
Elastic 中国社区官方博客1 小时前
使用 cloud-native Elasticsearch 与 ECK 运行
大数据·数据库·elasticsearch·搜索引擎·kubernetes·k8s·全文检索