2016-02-16 75 views
-4

我有兩個表:SQL服務器更換截尾詞在選擇替換表

Word_Blacklist

| Black_Word | Replace_Word 
1 | foo  | f** 
2 | bar  | b** 

ESCodes

| Beircht 
1 | this bar has good food 
2 | foo foo sentences 

選擇時乙從ESCodes我想ericht與Replace_Word替換子Black_Word所有出現,使得我的結果如下:

this b** has good f**d 
f** f** sentences 

我怎樣才能做到這一點?

+7

無需使用攻擊性的話作爲例子 – Ferrybig

+1

確實[Bericht]只包含一個詞,我們可以在「黑名單」的話加入這個領域或做[Bericht]包含許多單詞和任何每次「黑名單「的單詞應該被刪除(這將需要對所有黑名單單詞進行遞歸循環)? – Ralph

+0

它可以容納更多的單詞,, –

回答

1

編輯工作:你可以用動態替換做到這一點。這被建議作爲對不同question的答案。

-- first generate the replace statement with all Black_Words 
declare @replace varchar(max) 
select @replace = coalesce ('replace(' + @replace,'replace(bericht') + ',''' + Black_Word + ''',''' + Replace_Word + ''')' 
FROM Word_Blacklist 

-- execute statement 
exec('select ' + @replace + 'from ESCodes') 
+0

複雜並且不起作用 它必須在SELECT中完成 我不需要更新 –

+1

同樣的想法可以用於select,我會更新我的迴應。 – fqhv

+0

大,這一個工程,現在(如果它是不困難) 列1 black_word //第2欄是更換字 當black_word(他媽的),用於其與字替代它,科拉姆replace_word在同行(在這種情況下,它表示f ** k) –

1

這應該爲你

select IIF(exists(select name from table2), '****', name) 
from table1 
+0

正確的主意,但存在缺少where子句 – FuzzyTree

+0

@FuzzyTree,我們不需要where子句存在,因爲如果名稱存在表2,它是黑名單。 – FLICKER

+0

沒有一個子查詢將始終返回每一行相同的東西(無論table2是否爲空)。這似乎並不有用。我理解這個解決方案爲'select IIF(存在(從table2中選擇1,其中table2.name = table1.name),'****',name) from table1' – FuzzyTree

0

如果你需要一個高性能的解決方案,它可以很容易地使用eval SQL.NET做

免責聲明:我是這個項目的所有者Eval SQL.NET

庫讓你直接在SQL中使用C#語法。

DECLARE @tableMessage TABLE (Msg VARCHAR(250)) 

DECLARE @tableReplace TABLE 
    (
     Original_Word VARCHAR(50) , 
     Replace_Word VARCHAR(50) 
    ) 

INSERT INTO @tableMessage 
     (Msg) 
VALUES ('A test to replace FromWord1 and FromWord2!'), 
     ('FromWord1FromWord1FromWord1 FromWord1 FromWord2') 


INSERT INTO @tableReplace 
     (Original_Word, Replace_Word) 
VALUES ('FromWord1', 'ToWord1'), 
     ('FromWord2', 'ToWord2') 


DECLARE @sqlnet SQLNET = SQLNET::New('') 
DECLARE @sql VARCHAR(MAX) = 'template' 
DECLARE @pos VARCHAR(10) = '0'; 

-- CREATE the sql and set parameter value 
SELECT @sql = @sql + '.Replace(old_' + @pos + ', new_' + @pos + ')' , 
     @sqlnet = @sqlnet.ValueString('old_' + @pos, Original_Word) 
         .ValueString('new_' + @pos, Replace_Word) , 
     @pos = CAST(@pos AS INT) + 1 
FROM @tableReplace 

-- SET the code to evaluate 
-- template.Replace(old_0, new_0).Replace(old_1, new_1) 
SET @sqlnet = @sqlnet.Code(@sql).Root(); 

-- Evaluate the code 
SELECT Msg , 
     @sqlnet.ValueString('template', Msg).EvalString() 
FROM @tableMessage AS A 
+0

這太大了,太複雜我有我的答案,它比這更easyer –