【问题标题】:Find and replace a string in sql server 2005在 sql server 2005 中查找和替换字符串
【发布时间】:2010-10-16 14:53:39
【问题描述】:

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

  1. 将所有名为“Flat”的单词替换为空白,同时删除随之而来的数字。

例如。我有个词叫做“Flat 234 5th Street”。

它应该被替换为 5th Street。

我将查询作为

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

它返回了

第五街 123 号

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

如果是数字,则删除它,否则保留它。

谁能帮帮我。

问候, 盒马

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

您好 LittleBobbyTales,感谢您的回答。 实际上它不是标准格式,我可能只有 平123

或 Flat 123 5th Street 1st Main Road

或第一主楼1

没有规定我们在 Flat 之后会有 1 个数字或 2 个数字。 可能有也可能根本没有数字。

这两种方法都可以。

【问题讨论】:

  • 如果您发布代码或 XML,在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮 (101 010) 以很好地格式化和语法高亮!
  • 听起来像是正则表达式的完美匹配——不幸的是,SQL Server 的 T-SQL 查询语言在字符串操作/正则表达式匹配方面并不是很强大。你最好用 C# 之类的传统编程语言来做这件事......
  • 同意marc_s,但是出于好奇,能否多举一些需要解析的地址字段的例子?

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


【解决方案1】:

您可以使用标量值函数来去除平坦部分。棘手的部分是如何检查单词是否为数字:@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

【讨论】:

    猜你喜欢
    • 2011-02-08
    • 2014-07-31
    • 2011-08-22
    • 2020-05-27
    • 2015-09-22
    • 2019-06-24
    • 2016-01-13
    • 2011-10-23
    相关资源
    最近更新 更多