我正在使用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
所以我需要的select查询必须返回:
Hello, My name is not Thomas and i am from Belgium
有人可以帮忙吗?
答案 0 :(得分: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);
答案 1 :(得分:0)
免责声明:我是该项目的所有者Eval SQL.NET
这是使用Eval SQL.NET在T-SQL中使用C#代码的解决方案。
这个解决方案比“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