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

SQL中如何处理含字母的列并筛选数值大于35的数据?

问题分析与解决方案

你的SQL语句存在几个明显问题,导致返回0条数据:

  1. 列名拼写错误:把chocolate_weight写成了chocolote_weight,子查询无法正确读取目标列数据
  2. IN子句用法完全错误:IN用于判断值是否存在于某个集合中,而你需要对每行的chocolate_weight单独处理后做数值比较,完全不需要IN子句
  3. 字符串处理不彻底:只替换了x,没处理其他末尾字母(比如g);对2x5g这类带乘号的格式,直接替换x会得到25g,转数值时会失败

针对你的需求(去掉末尾字母后计算数值,筛选大于35的数据),下面分主流数据库给出解决方案:

MySQL 示例

SELECT *
FROM Chocolate
WHERE 
  CASE
    -- 处理带x的格式(比如2x5g → 2*5=10)
    WHEN chocolate_weight LIKE '%x%' THEN
      CAST(SUBSTRING_INDEX(REGEXP_REPLACE(chocolate_weight, '[a-z]+$', ''), 'x', 1) AS UNSIGNED) *
      CAST(SUBSTRING_INDEX(REGEXP_REPLACE(chocolate_weight, '[a-z]+$', ''), 'x', -1) AS UNSIGNED)
    -- 处理纯数字加后缀的格式(比如10g →10,30x→30)
    ELSE
      CAST(REGEXP_REPLACE(chocolate_weight, '[a-z]+$', '') AS UNSIGNED)
  END > 35;

SQL Server 2017+ 示例

SELECT *
FROM Chocolate
WHERE 
  CASE
    WHEN chocolate_weight LIKE '%x%' THEN
      CAST(PARSENAME(REPLACE(REGEXP_REPLACE(chocolate_weight, '[a-z]+$', ''), 'x', '.'), 2) AS INT) *
      CAST(PARSENAME(REPLACE(REGEXP_REPLACE(chocolate_weight, '[a-z]+$', ''), 'x', '.'), 1) AS INT)
    ELSE
      CAST(REGEXP_REPLACE(chocolate_weight, '[a-z]+$', '') AS INT)
  END > 35;

关键逻辑说明

  • REGEXP_REPLACE(chocolate_weight, '[a-z]+$', ''):去掉字段末尾的所有小写字母(如果有大写字母可改为[a-zA-Z]+$)
  • 对带x的格式,拆分前后两个数字并相乘,得到实际重量值
  • 最后将处理后的数值与35比较,筛选符合条件的行

内容的提问来源于stack exchange,提问作者user20167924

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:25:25