我正在使用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 + '%'
答案 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;