在sql server 2005中查找并替换字符串

时间:2010-10-16 14:53:39

标签: sql sql-server sql-server-2005 tsql

我应该从地址栏中删除以下内容。

  1. 将名为“Flat”的所有单词替换为空白空间,同时删除随附的数字。
  2. 例如。我称之为'Flat 234 5th Street'。

    它应该被替换为第五街。

    我将查询作为

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

    它返回了

    123 5th Street

    现在我必须找到是否在下一次出现空格之前,我有一个数值。

    如果是Numeric,则将其删除,否则将其保留。

    任何人都可以帮忙。

    此致 HEMA

    是的Marc_S,我应该这样做(已编辑)。 我不能用任何其他语言做。假设只在T-SQL中完成。

    嗨LittleBobbyTales,谢谢你的回答。 实际上它不是标准格式,我可能只有 Flat 123

    或第五街第一街123号

    或第1主单位1

    没有规则我们在单词Flat之后会有1个数字或2个数字。 可能有也可能没有数字。

    它可以是任何一种方式。

1 个答案:

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