MS SQL Server中单个字段如何同时使用split、cast、case when处理数据
SQL Server 实现方案
实现逻辑如下:
- 用
PATINDEX('%[^0-9]%', 目标列名)定位字符串中第一个非数字字符的位置,以此拆分数字部分和后缀部分 - 数字部分转成decimal类型,后缀部分通过CASE映射对应附加值,两者相加得到最终结果
完整查询代码
假设你的表名为YourTable,待处理的varchar列名为CodeVal,可直接使用以下查询:
SELECT CodeVal AS 原始值, -- 提取数字部分并转decimal类型 CAST( LEFT(CodeVal, CASE WHEN PATINDEX('%[^0-9]%', CodeVal) = 0 THEN LEN(CodeVal) ELSE PATINDEX('%[^0-9]%', CodeVal) - 1 END) AS DECIMAL(18,2) ) + -- 映射后缀对应的附加值,无后缀则加0 CASE WHEN PATINDEX('%[^0-9]%', CodeVal) = 0 THEN 0 WHEN SUBSTRING(CodeVal, PATINDEX('%[^0-9]%', CodeVal), 1) = 'A' THEN 0.25 WHEN SUBSTRING(CodeVal, PATINDEX('%[^0-9]%', CodeVal), 1) = 'H' THEN 0.5 WHEN SUBSTRING(CodeVal, PATINDEX('%[^0-9]%', CodeVal), 1) = 'T' THEN 0.75 ELSE 0 -- 可根据业务需求调整未知后缀的处理逻辑 END AS 转换后结果 FROM YourTable
运行效果对应你的示例输入:
- 原始值
2A→ 转换后结果2.25 - 原始值
10H→ 转换后结果10.5 - 原始值
4→ 转换后结果4.00 - 原始值
6T→ 转换后结果6.75
注意事项
如果你的字段存在前后空格,可先对CodeVal套一层LTRIM(RTRIM(CodeVal))做预处理,避免空格影响非数字字符的定位逻辑。
内容的提问来源于stack exchange,提问作者Vishal Zanzrukia
相关产品推荐
相关产品推荐

