MySQL如何从空格分隔字符串提取首数字并进行范围查询?
MySQL提取分辨率宽度并筛选的方法
嘿,这个需求我之前也碰到过,给你几个实用的解决方法,都是在MySQL里直接实现的:
方法一:用SUBSTRING_INDEX(最简洁高效)
SUBSTRING_INDEX函数可以按指定分隔符截取字符串的某一部分,这里我们用空格作为分隔符,取第一个部分就是分辨率的宽度。然后把它转成数值类型就能做范围筛选了。
写法1:用CAST转成数值
SELECT * FROM myTable WHERE CAST(SUBSTRING_INDEX(resolution, ' ', 1) AS UNSIGNED) > 500 AND CAST(SUBSTRING_INDEX(resolution, ' ', 1) AS UNSIGNED) < 1200;
写法2:用+0自动转数值(更简洁)
MySQL会自动把数字字符串转成数值,所以可以直接用+0来简化:
SELECT * FROM myTable WHERE (SUBSTRING_INDEX(resolution, ' ', 1) + 0) > 500 AND (SUBSTRING_INDEX(resolution, ' ', 1) + 0) < 1200;
如果想简化范围判断,也可以用BETWEEN(注意是闭区间,所以要调整数值来匹配“介于500至1200”的需求):
SELECT * FROM myTable WHERE (SUBSTRING_INDEX(resolution, ' ', 1) + 0) BETWEEN 501 AND 1199;
方法二:用LOCATE+SUBSTRING(兼容特殊场景)
如果担心有些resolution字段里没有空格(比如只存储了宽度值),可以用LOCATE先找到空格的位置,再截取字符串:
SELECT * FROM myTable WHERE CAST( CASE WHEN LOCATE(' ', resolution) > 0 THEN SUBSTRING(resolution, 1, LOCATE(' ', resolution)-1) ELSE resolution END AS UNSIGNED ) > 500 AND CAST( CASE WHEN LOCATE(' ', resolution) > 0 THEN SUBSTRING(resolution, 1, LOCATE(' ', resolution)-1) ELSE resolution END AS UNSIGNED ) < 1200;
不过其实SUBSTRING_INDEX已经处理了没有空格的情况(如果没空格,会返回整个字符串),所以方法一更省心。
进阶优化:虚拟列+索引(大数据量场景)
如果你的表数据量很大,每次查询都计算宽度会影响性能。MySQL 5.7及以上支持生成虚拟列,你可以预先把宽度计算好并存储,还能加索引:
-- 添加存储型虚拟列 ALTER TABLE myTable ADD COLUMN width INT GENERATED ALWAYS AS (CAST(SUBSTRING_INDEX(resolution, ' ', 1) AS UNSIGNED)) STORED; -- 给宽度列加索引 CREATE INDEX idx_mytable_width ON myTable(width);
之后查询就可以直接用width字段,速度会快很多:
SELECT * FROM myTable WHERE width > 500 AND width < 1200;
内容的提问来源于stack exchange,提问作者XCS
相关产品推荐
相关产品推荐

