You need to enable JavaScript to run this app. SQL拼接地址列时如何仅删除TELEGRAPH ST地址末尾的多余数字
优惠活动
大模型
产品
解决方案
定价
更多

SQL拼接地址列时如何仅删除TELEGRAPH ST地址末尾的多余数字

问题根因
  • 你之前的逻辑失效核心是两个SQL语法误区:
    1. REPLACE() 是精确字符串匹配函数,不支持[0-9]这类通配符模式,所以你写的替换数字逻辑完全不生效
    2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 16:15:09