MySQL中搜索JSON字段内province数据无结果的解决方法
解决MySQL JSON字段中搜索province无结果的问题
我来帮你搞定这个问题!你的查询语句返回空结果,核心原因是**JSON_EXTRACT函数返回的字符串会带有双引号**。举个例子,从你的JSON字段里提取province,得到的结果是"province 123",而你用LIKE "%prov%"匹配的是不带引号的子串,自然匹配不上啦。
下面给你几个可行的解决方案,按简洁度排序:
方案1:使用简写运算符->>(最推荐)
MySQL提供了->>运算符,它等价于JSON_UNQUOTE(JSON_EXTRACT(...)),能直接返回不带引号的字符串,语句更简洁:
SELECT * FROM orders WHERE LOWER(description->>"$.address.information.province") LIKE "%prov%";
方案2:用JSON_UNQUOTE手动去除引号
如果你想明确写出函数逻辑,可以用JSON_UNQUOTE包裹JSON_EXTRACT的结果,去掉双引号后再匹配:
SELECT * FROM orders WHERE LOWER(JSON_UNQUOTE(JSON_EXTRACT(description, "$.address.information.province"))) LIKE "%prov%";
方案3:MySQL 8.0+ 可用JSON_VALUE函数
如果你的MySQL版本是8.0及以上,还可以用JSON_VALUE函数,它专门用来提取JSON中的标量值,返回结果本身就不带引号:
SELECT * FROM orders WHERE LOWER(JSON_VALUE(description, "$.address.information.province")) LIKE "%prov%";
另外补充个小技巧:如果你的数据库排序规则是不区分大小写的(比如utf8mb4_general_ci),其实可以不用LOWER()函数,直接写LIKE "%prov%"也能匹配到大写的PROV相关内容,不过加上LOWER()兼容性更好。
内容的提问来源于stack exchange,提问作者moses toh
相关产品推荐
相关产品推荐

