用另一个表格中的单词替换句子中的单词

时间:2016-02-11 18:03:06

标签: sql sql-server tsql

我正在使用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

有人可以帮忙吗?

2 个答案:

答案 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