用缩写替换几个单词的简便方法

时间:2013-05-13 13:29:20

标签: sql sql-server

我有一个存储过程从“1 Spooner Street”这样的列中提取地址,但我需要缩写“Street”,“Apartment”等。

我知道我可以在REPLACE中为每个案例包装一次列名,但我想知道是否有不同的方法来执行此操作。

有什么想法吗?提示?

2 个答案:

答案 0 :(得分:3)

可能有效的一个建议是创建一个包含您要用来替换的所有值的表,类似于:

create table replacements
(
    id int identity primary key,
    orig_value varchar(50) not null,
    new_value varchar(50) not null
);

insert into replacements values
('Street', 'St'),
('Drive', 'Dr'),
('Boulevard', 'Blvd'),
('Apartment', 'Apt');

然后,您可以将此替换表加入主表并使用REPLACE()。一些样本数据:

create table addresses
(
    id int identity primary key,
    addr1 varchar(100) not null
);

insert into addresses values
('123 Main Street'),
('235 Blah Boulevard'),
('78 E Test Drive'),
('78 E Multiple Lane Apartment 23');

最后,您可以创建一个可用于将值替换为表中存在的值的函数。功能脚本:

create function replace_name
(
    @orig_value varchar(50)
)
returns varchar(50)
AS
BEGIN
    declare @new_address varchar(50)
    declare @i int = 0
    declare @totalReplacements int


    set @totalReplacements = (select COUNT(*) 
                                from dbo.replacements r
                                where @orig_value like '%'+r.orig_value+'%')
    set @new_address = @orig_value


    if @totalReplacements > 0
        begin
            while @i < @totalReplacements
                begin
                    set @new_address = (select top 1 replace(@new_address, r.orig_value, r.new_value)
                                        from dbo.replacements r
                                        where @new_address like '%'+r.orig_value+'%')

                    if @i <= @totalReplacements
                        set @i = @i + 1
                end
        end
    else 
        begin 
            set @new_address = @orig_value;
        end


    return @new_address;
END

然后,当您查询数据时,您将地址传递给函数:

select a.id, 
  a.addr1, 
  dbo.replace_name(a.addr1) newAddress
from dbo.addresses a;

SQL Fiddle with Demo。这将得到结果:

| ID |                            ADDR1 |              NEWADDRESS |
-------------------------------------------------------------------
|  1 |                  123 Main Street |             123 Main St |
|  2 |               235 Blah Boulevard |           235 Blah Blvd |
|  3 |                  78 E Test Drive |            78 E Test Dr |
|  4 | 57 E Multiple Drive Apartment 23 | 57 E Multiple Dr Apt 23 |
|  5 |                        19 E none |               19 E none |

答案 1 :(得分:0)

另一个想法(没有代码)是创建另一个包含两个字符串的表 - 一个用于完整的单词,另一个用于缩写。

然后在你的程序中,循环这些条目,搜索原始记录中的完整单词,并用缩写替换。

以这种方式,代码将更短且更易于阅读 - 当您需要向列表中添加一个缩写时,行为将是数据驱动的,而不是硬编码。