SQL中如何处理含字母的列并筛选数值大于35的数据?
问题分析与解决方案
你的SQL语句存在几个明显问题,导致返回0条数据:
- 列名拼写错误:把
chocolate_weight写成了chocolote_weight,子查询无法正确读取目标列数据 - IN子句用法完全错误:IN用于判断值是否存在于某个集合中,而你需要对每行的
chocolate_weight单独处理后做数值比较,完全不需要IN子句 - 字符串处理不彻底:只替换了
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
相关产品推荐
相关产品推荐

