【问题标题】:Dynamic SQL Search & Replace Function动态 SQL 查找替换功能
【发布时间】:2012-09-04 09:10:47
【问题描述】:

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

原标题

MS SQL 函数来操作字符串

原始问题

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

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

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

示例输入/输出名称:

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

【问题讨论】:

    标签: sql-server function dynamic replace


    【解决方案1】:

    如果您将所有搜索和替换值放在一个表中,那么您可以编写几行 SQL 来循环遍历 S&R 值以修复名称。向prefix 表添加更多 S&R 对很容易,因此您的 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 循环首先处理子前缀。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-05
      • 2015-09-28
      • 2012-08-13
      • 2022-06-15
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 2019-02-15
      相关资源
      最近更新 更多