SQL替换使用与Like的连接

时间:2014-04-22 22:09:09

标签: sql sql-server-2008

我正在使用SQL 2008。

tblComments是一个存储用户评论的数据表。 tblErrorNumbers是一个查找表,它包含有限的错误列表及其相关描述。几个例子:

Error Number | Error Description
100          | Unreadable  
200          | Printer Error

我被要求在评论字段中找到所有对错误号的引用,并将其替换为错误描述。因此,例如,替换

Blah 100 Blah 

Blah Unreadable Blah 

只要表格中只有一个错误编号匹配,我所拥有的内容才有效。但是......如果我有这个:

Blah 100 Blah 200 Blah

结果集是:

Blah 100 Blah Printer Error Blah

为什么会这样?如何使用描述替换数字的所有引用?任何帮助赞赏。谢谢!

SQL:

select 

a.comments as originalString,
REPLACE (a.comments, b.errorNumber, b.errorDescription) As newString


from tblComments a

Left Join tblErrorNumbers b ON a.comments LIKE '%' + b.errorNumber + '%'

1 个答案:

答案 0 :(得分:3)

唉,replace()一次仅适用于一条评论。并且,它们不是嵌套的。每个都被独立替换。

一种解决方案是使用递归CTE。我认为以下内容应该举例说明如何执行此操作:

with ErrorNumbers as (
      select row_number() over (order by ErrorNumber) as seqnum, en.*
      from tblErrorNumbers en
     ),
     cte as (
      select replace(c.comments, en.errorNumber, en.errorDescription) as comments,
             1 as seqnum,
             (select max(seqnum) from ErrorNumbers) as maxseqnum
      from tblComments c left outer join
           ErrorNumbers en
           on en.seqnum = 1
      union all
      select replace(cte.comments, en.errorNumber, en.errorDescription) as comments, 
             cte.seqnum + 1, cte.maxseqnum
      from cte join
           ErrorNumbers en
           on en.seqnum = cte.seqnum + 1
      where cte.seqnum <= cte.maxseqnum
     )
select distinct comments
from cte;