MySQL如何从位置不固定的产品描述中提取宽度数值?
提取产品描述中的宽度纯数值解决方案
针对你遇到的问题——原来的substring_index方法无法适配多种格式的描述文本,也处理不了纯数字的情况,我们可以用正则表达式匹配的方式来解决,下面分常见数据库给出具体实现:
MySQL 8.0+ 实现
使用REGEXP_SUBSTR结合CASE语句,既能处理带width(不区分大小写)的描述,也能处理纯数字的情况:
SELECT description, CASE -- 先处理包含width的情况 WHEN LOWER(description) LIKE '%width%' THEN TRIM(REGEXP_SUBSTR(LOWER(description), '[0-9]+(\\.[0-9]+)?', LOCATE('width', LOWER(description)))) -- 再处理纯数字的情况 ELSE TRIM(REGEXP_SUBSTR(description, '[0-9]+(\\.[0-9]+)?')) END AS width_value FROM productlisting;
逻辑解释:
- 大小写兼容:用
LOWER()统一转换为小写,避免Width/width的大小写差异问题 - 数字匹配规则:
[0-9]+(\\.[0-9]+)?可以匹配整数(如100、90)和小数(如50.5) - 精准定位:当描述包含
width时,从width的位置开始匹配数字,避免误抓其他无关数字 - 去空格处理:
TRIM()去掉数字前后可能存在的空格(比如示例3中的200)
PostgreSQL 实现
PostgreSQL可以用regexp_match提取分组内容,同样适配所有场景:
SELECT description, COALESCE( -- 提取width后的数字 (regexp_match(lower(description), 'width.*?([0-9]+(\.[0-9]+)?)'))[1], -- 提取纯数字内容 (regexp_match(description, '^([0-9]+(\.[0-9]+)?)$'))[1] ) AS width_value FROM productlisting;
为什么原来的方法不行?
你之前用的substring_index(substring_index(description, 'width', -1),'cm', 1)有两个核心问题:
- 格式局限性:只能处理
width和cm之间直接是数字的情况,遇到width of 500 cm或width(50.5cm)时,会把of或(这类无关字符也包含进来 - 纯数字场景不兼容:第一条记录只有数字,没有
width和cm,所以两次substring_index后会返回空值
内容的提问来源于stack exchange,提问作者Mark McP
相关产品推荐
相关产品推荐

