2010-10-16 110 views
2

我应该从地址字段中删除以下内容。查找并替换SQL Server 2005中的字符串

  1. 将所有名为'Flat'的单词替换为空白,同时删除伴随它的数字。

例如,我有一个名字叫'Flat 234 5th Street'。

它应该被替换为第5街。

我把查询作为

select 
    ltrim(rtrim(substring ('Flat 123 5th Street', charindex('Flat ','Flat 123 5th Street') + 5, len ('Flat 123 5th Street')))) 

它返回

123街5号

现在,我必须找到是否直至空间的下一次出现,我有一个数值或不是。

如果数字,然后删除它,否则离开它。

任何人都可以帮忙。

问候, 喝骂

是Marc_S,我不该那么做(编辑)。 我无法用其他语言做。假设仅在T-SQL中执行。

嗨LittleBobbyTales,谢谢你的答案。 其实它不是一个标准的格式,我可能只有 平123

或平123五街1号主道

或1主平1

没有规则,我们将有1号或Flat后的2个数字。 可能有也可能没有数字。

它可以是任何一种方式。

+0

如果您发布的代码或XML,** **请在高亮文本编辑器的线,然后点击在编辑器工具栏上的“代码”按钮(101 010)上进行很好的格式化和语法突出显示! – 2010-10-16 14:56:17

+0

听起来像一个正则表达式的完美匹配 - 不幸的是,SQL Server的T-SQL查询语言在字符串操作/正则表达式匹配中并不是非常强大。你最好用像C#这样的传统编程语言来做这件事...... – 2010-10-16 15:02:55

+0

同意marc_s,但出于好奇,你能否给出更多你需要解析的地址字段的例子? – LittleBobbyTables 2010-10-16 15:22:37

回答

2

您可以使用标量值函数去除平坦部分。棘手的部分是如何检查一个单词是否是一个数字:@word like '%[^0-9]%'通过查找不是0-9的字符来实现。完整的示例:

if OBJECT_ID('fn_StripFlat') is not null 
    drop function fn_StripFlat 
go 
create function dbo.fn_StripFlat(
    @street varchar(150)) 
returns varchar(150) 
as begin 
    declare @word varchar(150) 
    declare @result varchar(150) 
    declare @cur int 
    declare @next int 
    declare @in_flat bit 

    set @cur = 1 
    while 1=1 
     begin 
     set @next = CHARINDEX(' ', @street, @cur) 
     if @next = 0 
      set @word = SUBSTRING(@street, @cur, len(@street) - @cur + 1) 
     else 
      set @word = SUBSTRING(@street, @cur, @next - @cur) 

     if @word = 'flat' 
      begin 
      set @in_flat = 1 
      end 
     else if @word like '%[^0-9]%' 
      begin 
      set @in_flat = 0 
      set @result = IsNull(@result + ' ','') + @word 
      end 

     if @next = 0 
      break 
     set @cur = @next + 1 
     end 
    return IsNull(@result,'') 
end 
go 

测试代码:

declare @Streets table (street varchar(150)) 
insert @Streets 
      select 'Flat 234 5th Street' 
union all select 'Flat 123 456 5th Street 1st Main Road' 
union all select '1st Main Flat 1' 
union all select '5th Street 1st Main Road' 
union all select 'FlatStreet' 
union all select '' 

select street 
,  dbo.fn_StripFlat(street) 
from @Streets 

此打印:

Flat 234 5th Street      5th Street 
Flat 123 456 5th Street 1st Main Road 5th Street 1st Main Road 
1st Main Flat 1       1st Main 
5th Street 1st Main Road    5th Street 1st Main Road 
FlatStreet        FlatStreet