2014-09-23 14 views
1

例如,我想用以下腳本中的字符串r._to替換t.s中所有出現的字符串r._from替換所有出現的指定字符串值(存儲在表中)?

with r(_from, _to) 
      as (select 'aaa', '' 
       union all 
       select 'bbb', '' 
       union all 
       select 'ccc', '' 
       -- union all ..... and more 
      ), 
     t(s) 
      as (select 'ABCaaaDEFbbb' 
       union all 
       select '123aaabbb456' 
      ) 
    select t.s, .... -- replace aaa, bbb, ccc, ... with empty string '' 
    from t 

應該返回

 
ABCDEF 
123456 

假設有一個強大的replace函數接受一個映射表進行更換:select replace(t.s, (select * from r)) from t,這是一個問題什麼。代碼將被放入視圖中,因此我無法更新表格或使用臨時表格。任何xquery技巧? (或者回落到動態創建與縮進replace(replace(replace(.....使用XQuery視圖?)

+0

這可能有助於http://stackoverflow.com/questions/7844481/aggregate-replace-in-sql-server – FuzzyTree 2014-09-23 20:22:57

+0

據我所知沒有b用於多次替換的內置函數,因此執行此操作的方式涉及某種類型的迭代。這可以採取循環,遞歸cte,遊標的形式,或者使用其中一個或者甚至'select @var = ...'遞歸方法來滾動你自己的函數。也可以使用這些方法中的任何一種來創建和運行動態sql,它輸出類似'replace(替換(替換(...')。 – 2014-09-23 20:23:35

+0

還要注意,所有常規解決方案都發生在sequence_中,如'select replace (替換('ab','a','b'),'b','a')''''aa'。 – 2014-09-23 20:29:27

回答

0

您可以編寫自己的CLR:

using System; 
using Microsoft.SqlServer.Server; 
using System.Text.RegularExpressions; 

public partial class RegExBase 
{ 
    [SqlFunction(IsDeterministic = true, IsPrecise = true)] 
    public static string RegExReplace(string pattern, string matchString, string replacement) 
    { 
    Regex r1 = new Regex(pattern.TrimEnd(null)); 
    return Regex.replace(matchString.TrimEnd(null), replacement); 
    } 
}; 

,然後使用它:

with r(_from, _to) as (
    select 'aaa', '' 
    union all 
    select 'bbb', '' 
    union all 
    select 'ccc', '' 
-- union all ..... and more 
), t(s) as (
    select 'ABCaaaDEFbbb' 
    union all 
    select '123aaabbb456' 
) 
select dbo.RegExReplace(r.from, t.s, r.to) 
    from t, r 

對於閱讀更多信息this

+0

交叉連接將複製't'中的行嗎? – ca9163d9 2014-09-24 14:51:50

相關問題