2016-02-11 121 views
3

我正在使用SQL Server,我想創建一個SELECT查詢,該查詢用另一個表中的單詞替換字符串中的一個或多個單詞。就像這樣:用另一個表中的詞替換單詞

SELECT [Message] from Table1 

返回:

Hello, my name is Thomas and i'm from Belium. 

Table2我有兩列

Original_Word-------Replace_Word 
is------------------------is not 
i'm-------------------------i am 

所以選擇查詢,我需要必須返回此:

Hello, My name is not Thomas and i am from Belgium 

燦任何人 幫幫我?

+0

我認爲這是一個罕見的情況下,光標可能是一個最好的解決方案 – Lamak

+0

多少錢的話,你需要更換?總是2?或者它是可變的? –

+0

我猜你會在這裏需要一個存儲過程。 – jarlh

回答

4

您可以使用動態SQL來構建一個嵌套的替換:

DECLARE @sql varchar(max) = ''' '' + [Message] + '' '''; 

SELECT @sql = 'REPLACE(' + @sql + ',''' + REPLACE(' '+Original_Word+' ','''','''''') + ''',''' + REPLACE(' '+Replace_Word+' ','''','''''') + ''')' 
FROM Table2; 

SET @sql = 'SELECT LTRIM(RTRIM(' + @sql + ')) FROM Table1'; 

PRINT(@sql) 
EXECUTE (@sql); 
+0

雖然我認爲這個想法很好,但它有一些問題,例如'i'm'中的單引號。而且,它不能替代*字符*而不僅僅是字母。在這種情況下,你會用'mis nots'代替'miss' – Lamak

+0

Tab,好的工作,我只是用replace()來編輯你的答案來照顧字符串中的引號。 –

+1

這很好!但它沒有考慮到適當的間距。如果'OriginalWord'爲「is」且'ReplacementWord'爲「不是」,則「istanbul」的'Message'變爲「istanbul」。您需要通過填充每個條目的空格或填充替換語句來解決表中的問題。 – JiggsJedi

0

免責聲明:我的項目Eval SQL.NET

這裏的主人是在T-使用C#代碼的解決方案SQL使用Eval SQL.NET。

該解決方案比「EXECUTE」稍微複雜一點,但至少您可以安全使用SQL注入。 您甚至可以通過使用Regex.Replace改善解決方案。

文檔:Use regular expression in SQL

DECLARE @tableMessage TABLE (Msg VARCHAR(250)) 

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

INSERT INTO @tableMessage 
     (Msg) 
VALUES ('Hello, my name is Thomas and i''m from Belium.'), 
     ('Another Template with is or is and i''m or not!') 


INSERT INTO @tableReplace 
     (Original_Word, Replace_Word) 
VALUES ('is', 'is not'), 
     ('i''m', 'i am') 


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 
相關問題