删除字符串末尾的子串的最简单/最好的方法是什么?

时间:2010-12-08 09:48:53

标签: sql tsql replace

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

修改

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在SQL Server 2005中,可以定义一个启用regular expression matching的用户功能。您需要定义一个剥离尾随字符串的函数。与您提到的场景相匹配的RegEx将类似......

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