我有一个存储过程从“1 Spooner Street”这样的列中提取地址,但我需要缩写“Street”,“Apartment”等。
我知道我可以在REPLACE中为每个案例包装一次列名,但我想知道是否有不同的方法来执行此操作。
有什么想法吗?提示?
答案 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)
另一个想法(没有代码)是创建另一个包含两个字符串的表 - 一个用于完整的单词,另一个用于缩写。
然后在你的程序中,循环这些条目,搜索原始记录中的完整单词,并用缩写替换。
以这种方式,代码将更短且更易于阅读 - 当您需要向列表中添加一个缩写时,行为将是数据驱动的,而不是硬编码。