优化获取字符串最后一个字符的SQL写法咨询
优化RUT字符串拆分的SQL实现
需求:处理8位和9位的RUT字符串,输出三列:
- 原始字符串
- 去掉最后一个字符的字符串
- 仅保留最后一个字符
原SQL通过CASE语句判断长度提取最后一位,虽然可正常运行,但写法冗余、扩展性差。以下是更简洁的优化方案:
原代码
select rut, SUBSTR(RUT, 1, LENGTH(RUT)-1) as RUT_SD, case when length(rut) = 9 then SUBSTR(RUT, 9, LENGTH(RUT)-1) when length(rut) = 8 then SUBSTR(RUT, 8, LENGTH(RUT)-1) end as DV from (select '244447232' rut union all select '3446545k')
优化方案1:利用SUBSTR负索引
大部分SQL方言(如MySQL、PostgreSQL、Oracle)支持负索引表示从字符串末尾计数,直接提取最后一位:
select rut, SUBSTR(RUT, 1, LENGTH(RUT)-1) as RUT_SD, SUBSTR(RUT, -1) as DV -- 无需判断长度,直接取最后一个字符 from (select '244447232' rut union all select '3446545k')
优化方案2:使用RIGHT函数
若你的SQL方言支持RIGHT()函数(如MySQL、SQL Server),写法更直观:
select rut, SUBSTR(RUT, 1, LENGTH(RUT)-1) as RUT_SD, RIGHT(RUT, 1) as DV -- 直接提取右侧1位字符 from (select '244447232' rut union all select '3446545k')
优化优势
- 代码简洁,移除冗余CASE分支
- 扩展性强:后续出现其他长度的RUT字符串,无需修改代码即可适配
- 逻辑直观,降低维护成本
内容的提问来源于stack exchange,提问作者Nelson Romero
相关产品推荐
相关产品推荐

