【问题标题】:What is the simplest/best way to remove substrings at the end of a string?在字符串末尾删除子字符串的最简单/最好的方法是什么?
【发布时间】:2011-05-22 03:04:42
【问题描述】:

我有一个标准化地址的函数。我现在想做的是删除有限的指定列表中的任何字符串,如果它们出现在字符串的末尾。假设我要删除的字符串是'st','ave','rd','dr','ct'......如果字符串以这些字符串中的任何一个结尾,我想删除它们。使用 T-SQL 完成此操作的最佳方法是什么(这将成为 select 语句的一部分)?

编辑:

这是一个接受一个地址并对其进行格式化的函数。我想以最简单的方式内联代码和列表。例如,我一直在玩的一些代码是:

if @address LIKE '%st'
 SET @address = substring(@address, 1, PatIndex('%st', @address) - 1)

这是一个好方法吗?我怎样才能把它放在某种循环中,以便我可以用不同的值(st 除外)重复这段代码?

【问题讨论】:

    标签: sql tsql replace


    【解决方案1】:

    将要修剪的值添加到新表允许您

    • 轻松添加新值
    • 使用此表清理地址

    SQL 语句

    DECLARE @Input VARCHAR(32)
    SET @Input = 'Streetsstaverddrad'
    
    DECLARE @Trim TABLE (Value VARCHAR(32))
    
    INSERT INTO @Trim
    SELECT 'st'
    UNION ALL SELECT 'ave'
    UNION ALL SELECT 'rd'
    UNION ALL SELECT 'dr'
    UNION ALL SELECT 'ad'
    
    WHILE EXISTS (
      SELECT  * 
      FROM    (
                SELECT  [Adres] = @Input
               ) i 
               INNER JOIN @Trim t ON i.Adres LIKE '%' + t.Value
      )
    BEGIN
      SELECT  @Input = SUBSTRING(Adres, 1, LEN(Adres) - LEN(t.Value))
      FROM    (
                SELECT  [Adres] = @Input
              ) i
              INNER JOIN @Trim t ON i.Adres LIKE '%' + t.Value
    END          
    
    SELECT @Input
    

    【讨论】:

    • 这是一个一次接受一个地址并对其进行规范化的函数......没有“地址”表
    • @froadie,我已经更改了要在函数中使用的概念。 'Streetst' 字符串将替换为您的输入变量。请注意,此解决方案仅删除 one 结尾。
    • 当我尝试使用此代码时,我得到“关键字'with'附近的语法不正确”。另外,你能解释一下你想用“with q ...”代码做什么吗?我还没有真正见过这样的语法,也不明白它在做什么......
    • @froadie - with 只是为了获取输入值作为语句中的表格,使用普通选择也很容易完成。我已经从答案中删除了“解决方案”。
    【解决方案2】:

    在 SQL Server 2005 中,可以定义启用regular expression matching 的用户函数。您将需要定义一个去除尾随字符串的函数。匹配您提到的场景的正则表达式将类似于...

    \s+(ave|rd|dr|ct)\s*$
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2011-10-03
      • 2023-03-05
      • 1970-01-01
      • 2010-11-05
      相关资源
      最近更新 更多