使用->>运算符的SQL存储过程导入phpMyAdmin时出现语法错误
修复MySQL 5.6存储过程中的JSON语法错误
嘿,我瞅了下你写的这个存储过程,导入phpMyAdmin时碰到的语法问题,根源在JSON字段的提取语法上。先把你的原代码贴出来方便分析:
CREATE PROCEDURE `getAssetDetailsforPDF`( ) BEGIN Select class.Name as AssetName, getOperatingZoneName( ifnull(getoperatingzone(class.ID), 0) ) as OperatingZone, getTimetoFailure( class.ID ) as TagValue, class1.Name as LineName, details.Defintion ->> '$."Asset ID"' as definition from asset_classification class left join asset_classification class1 on class1.ParentId = 2 left join asset_details details on details.Id in( select class.ID ) Where class.MCT_typeId = 5 and class.ParentId in( Select class1.ID ) group by class.Id ; END ;
为啥会报错?
你收到的错误提示You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '>'$."Asset ID"',结合你的MySQL 5.6.49-89.0-log版本,问题有两个:
- MySQL 5.6根本不支持
->>这种JSON字段提取的快捷语法——这个语法是从MySQL 5.7.9才开始引入的,老版本不认它。 - 你还写错了字段名:
Defintion应该是Definition(少了个字母i),这个虽然不是当前报错的直接原因,但后续肯定会引发字段不存在的问题。
怎么改?
针对MySQL 5.6版本,咱们用原生的JSON_EXTRACT()函数替代->>,同时修正字段拼写:
CREATE PROCEDURE `getAssetDetailsforPDF`( ) BEGIN Select class.Name as AssetName, getOperatingZoneName( ifnull(getoperatingzone(class.ID), 0) ) as OperatingZone, getTimetoFailure( class.ID ) as TagValue, class1.Name as LineName, JSON_EXTRACT(details.Definition, '$."Asset ID"') as definition from asset_classification class left join asset_classification class1 on class1.ParentId = 2 left join asset_details details on details.Id = class.ID -- 这里的in子查询完全可以简化成直接等于,效率更高 Where class.MCT_typeId = 5 and class.ParentId in( Select class1.ID ) group by class.Id ; END ;
另外提个小优化:details.Id in( select class.ID )这种写法没必要,因为子查询只返回单个值,改成details.Id = class.ID查询会更高效。
额外提示
你的MySQL版本确实比较老了,5.6对JSON的支持很有限,如果之后有机会升级到5.7及以上版本,就能用上->>、JSON_UNQUOTE()这类便捷语法了。
内容的提问来源于stack exchange,提问作者lazzy_ms
相关产品推荐
相关产品推荐

