You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:46:53