如何在MySQL中获取JSON列元素的最后三个字符?
解决JSON字段中提取Logo后缀判断SVG格式的问题
问题根源
JSON_EXTRACT返回的JSON字符串默认带双引号(例如"example.svg"),直接用RIGHT取3个字符会得到vg",是因为包含了末尾的引号。- MySQL中没有
LEN函数,需用CHAR_LENGTH(按字符计数,适合多字节字符)或LENGTH(按字节计数,单字节场景可用)替代。
正确实现方法
方法1:先去除JSON字符串的引号,再提取后缀
使用JSON_UNQUOTE去掉JSON_EXTRACT结果的引号,再用RIGHT或SUBSTRING提取最后3个字符:
-- RIGHT写法 SELECT RIGHT(JSON_UNQUOTE(JSON_EXTRACT(settings, '$.Logo')), 3) AS logo_suffix FROM user; -- SUBSTRING写法 SELECT SUBSTRING( JSON_UNQUOTE(JSON_EXTRACT(settings, '$.Logo')), CHAR_LENGTH(JSON_UNQUOTE(JSON_EXTRACT(settings, '$.Logo'))) - 2 ) AS logo_suffix FROM user;
方法2:用简化运算符->>替代嵌套函数
MySQL 5.7及以上版本支持->>运算符,等价于JSON_UNQUOTE(JSON_EXTRACT()),写法更简洁:
-- RIGHT写法(推荐) SELECT RIGHT(settings->>'$.Logo', 3) AS logo_suffix FROM user; -- SUBSTRING写法 SELECT SUBSTRING( settings->>'$.Logo', CHAR_LENGTH(settings->>'$.Logo') - 2 ) AS logo_suffix FROM user;
直接判断是否为SVG格式
可以直接在查询中添加条件筛选:
-- 查询所有Logo后缀不是svg的记录 SELECT * FROM user WHERE RIGHT(settings->>'$.Logo', 3) != 'svg'; -- 用LIKE匹配后缀的写法(更直观) SELECT * FROM user WHERE settings->>'$.Logo' NOT LIKE '%.svg';
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

