SQL拼接地址列时如何仅删除TELEGRAPH ST地址末尾的多余数字
问题根因
- 你之前的逻辑失效核心是两个SQL语法误区:
REPLACE()是精确字符串匹配函数,不支持[0-9]这类通配符模式,所以你写的替换数字逻辑完全不生效CHARINDEX()同样不支持通配符匹配,自定义函数里传%[0-9]%是查找这个字符序列本身,不是查找数字位置,自然得不到正确结果
可行解决方案
你使用的是SQL Server环境,针对TELEGRAPH开头的街道提取末尾数字之前的内容,有两种稳定实现方式:
方案1:无需自定义函数,直接在CASE语句内实现
Address_Line1 = CASE WHEN UPPER(street1) LIKE 'TELEGRAPH%' THEN loadd1 + ' ' + RTRIM(LEFT(street1, LEN(street1) - PATINDEX('%[0-9]%', REVERSE(street1)) + 1)) WHEN street1 LIKE 'M %[0-9]%' OR street1 LIKE 'US %[0-9]%' THEN loadd1 + ' ' + CONCAT(street1, ' HWY') ELSE loadd1 + ' ' + street1 END
逻辑说明:用支持通配符匹配的PATINDEX()函数,先将字符串反转找到第一个数字的位置,再从原字符串开头截取到该位置之前的内容,就能一次性去掉末尾连续数字和前置空格,加UPPER()匹配是为了兼容小写telegraph开头的场景。
方案2:修正后的自定义函数实现
如果需要复用去末尾数字的逻辑,可以使用调整后的函数:
CREATE FUNCTION [dbo].RemoveTrailingNumbers(@x VARCHAR(MAX)) RETURNS VARCHAR(MAX) AS BEGIN DECLARE @FirstNumPos INT SET @FirstNumPos = PATINDEX('%[0-9]%', REVERSE(@x)) IF @FirstNumPos > 0 RETURN RTRIM(LEFT(@x, LEN(@x) - @FirstNumPos + 1)) RETURN @x END
调用方式:
Address_Line1 = CASE WHEN UPPER(street1) LIKE 'TELEGRAPH%' THEN loadd1 + ' ' + [dbo].RemoveTrailingNumbers(street1) WHEN street1 LIKE 'M %[0-9]%' OR street1 LIKE 'US %[0-9]%' THEN loadd1 + ' ' + CONCAT(street1, ' HWY') ELSE loadd1 + ' ' + street1 END
效果验证
输入值Telegraph st 400处理后输出为{loadd1对应值} Telegraph st,完全符合需求,10万条数据量级下两种方案执行效率都足够,不会有性能问题。
内容的提问来源于stack exchange,提问作者ringtshe
相关产品推荐
相关产品推荐

