0

@dmarkez 昨天问了一个问题,就在我点击Post Your Answer按钮之前,他删除了这个问题。我认为答案值得分享......他没有重新发布这个问题,所以我希望他不介意我重新发布它,以便我可以与其他尝试类似问题的人分享答案:

原始标题

用于操作字符串的 MS SQL 函数

原始问题

我需要一个 MS SQL 函数,它需要确定带有前缀的名称,然后将其与实际名称结合起来。

实现这一目标的最佳方法或功能是什么?

前缀名称:Te、De、Van、Dela、O、Mc、San、Los 等……</p>

示例输入/输出名称:

van dam te mora te-> vandam temora te

o mara dela cruz -> omara delacruz

mc arthur white o san miguel -> mcarthur white osanmiguel

moana te aro van dolf-> moana tearo vandolf
4

1 回答 1

0

如果将所有搜索和替换值放在一个表中,则可以编写几行 SQL 循环遍历 S&R 值以修复名称。向表格中添加更多 S&R 对很容易prefix,因此您的 S&R 例程是动态的:

declare @prefix table (srch varchar(255), rplc varchar(255))
declare @names table (name varchar(255))

insert into @prefix
values ('te ', 'te'), ('de ', 'de'), ('van ', 'van'), ('dela ', 'dela'), ('san ', 'san'), ('o ', 'o'), ('mc ', 'mc'), ('los ', 'los')

insert into @names
values ('van dam te mora te'), ('o mara dela cruz'), ('mc arthur white o san miguel'), ('moana te aro van dolf')

while (1=1)
begin
  update n
  set    n.name = replace(n.name, p.srch, p.rplc)
  from   @names n,
         @prefix p
  where  (n.name like p.srch + '%') or (n.name like '% ' + p.srch + '%')

  if @@rowcount = 0
    break
end

select * from @names

请注意前缀表中的('san ', 'san')前面('o ', 'o')。这是因为san之前必须更换o,否则osanmiguel会保留osan miguel。因此,S&R 的顺序很重要。您需要将聚集索引添加到正确排序 S&R 记录的前缀表中,以便 S&R 循环首先处理子前缀。

于 2012-09-11T12:27:13.910 回答