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

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;

逻辑解释:

  1. 大小写兼容:用LOWER()统一转换为小写,避免Width/width的大小写差异问题
  2. 数字匹配规则:[0-9]+(\\.[0-9]+)?可以匹配整数(如100、90)和小数(如50.5)
  3. 精准定位:当描述包含width时,从width的位置开始匹配数字,避免误抓其他无关数字
  4. 去空格处理: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:02:57