SQL实现low/med/high类文本评级值到对应数字的映射转换
SQL实现评级文本到数值的映射方案
首先明确两个前置注意事项:
- 从提供的样本数据看,现有评级字段存在大小写不统一、缩写混用的问题(比如同时存在
Low/low、Med是medium的缩写),转换前必须先做文本清洗,否则会出现匹配失败、返回空值的问题 - 固定映射规则:very low→0、low→1、medium→2、high→3、very high→4
场景1:查询时动态生成数值列(推荐用于临时分析、数据可视化取数)
不需要修改原表结构,在查询语句中直接通过CASE WHEN逻辑做转换即可,该写法兼容绝大多数主流数据库(MySQL、PostgreSQL、SQL Server等):
SELECT Field, Disease, Rating, CASE -- 先去空格、转小写统一格式,避免大小写、前后空格导致匹配失败 WHEN LOWER(TRIM(Rating)) = 'very low' THEN 0 WHEN LOWER(TRIM(Rating)) = 'low' THEN 1 WHEN LOWER(TRIM(Rating)) IN ('medium', 'med') THEN 2 -- 兼容Med缩写 WHEN LOWER(TRIM(Rating)) = 'high' THEN 3 WHEN LOWER(TRIM(Rating)) = 'very high' THEN 4 ELSE NULL -- 匹配不到的异常值返回空,方便后续排查脏数据 END AS Rating_Score FROM 替换成你的实际表名;
语句说明:
TRIM(Rating):去除评级文本前后可能存在的多余空格,避免因为录入时误加空格导致匹配失败LOWER():将评级文本统一转为小写,不管原数据是首字母大写、全小写还是全大写,都能正常匹配- 对
medium的匹配额外加入了缩写med的判断,覆盖样本里出现的缩写场景
场景2:在原表中永久新增数值评级列
如果你需要长期使用这个数值评级,不想每次查询都写转换逻辑,可以给表新增固定字段存储映射值,分两步执行:
- 新增数值类型字段
ALTER TABLE 替换成你的实际表名 ADD COLUMN Rating_Score TINYINT NULL;
- 按照映射规则批量更新字段值
UPDATE 替换成你的实际表名 SET Rating_Score = CASE WHEN LOWER(TRIM(Rating)) = 'very low' THEN 0 WHEN LOWER(TRIM(Rating)) = 'low' THEN 1 WHEN LOWER(TRIM(Rating)) IN ('medium', 'med') THEN 2 WHEN LOWER(TRIM(Rating)) = 'high' THEN 3 WHEN LOWER(TRIM(Rating)) = 'very high' THEN 4 ELSE NULL END;
如果你的数据库支持生成列(计算列),可以配置成自动同步的字段,后续原Rating字段新增、修改时,数值列会自动更新,不需要手动执行更新语句,以MySQL为例的写法:
ALTER TABLE 替换成你的实际表名 ADD COLUMN Rating_Score TINYINT GENERATED ALWAYS AS ( CASE WHEN LOWER(TRIM(Rating)) = 'very low' THEN 0 WHEN LOWER(TRIM(Rating)) = 'low' THEN 1 WHEN LOWER(TRIM(Rating)) IN ('medium', 'med') THEN 2 WHEN LOWER(TRIM(Rating)) = 'high' THEN 3 WHEN LOWER(TRIM(Rating)) = 'very high' THEN 4 ELSE NULL END ) STORED;
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

