【发布时间】:2018-01-29 17:11:22
【问题描述】:
我有两个具有以下(虚拟)结构的表:
Table 1
idText sText(nvarchar(500))
1 Text with some keywords
2 Text2 with one keyword
3 Text3 with three keywords
Table 2
idText idKey sKeyword
1 1 some
1 2 keywords
2 3 one
3 4 with
3 2 keywords
3 5 three
有没有办法在Table2的所有相关关键字之间执行嵌套替换?
有一些解决方案,比如创建一个函数,但我认为这不是一个好的解决方案,因为它不会在其他任何地方重用。我也尝试过递归 CTE,但没有成功。
结果一定是这样的:
Table 1
idText sText(nvarchar(500))
1 Text with Replaced_some Replaced_keywords
2 Text2 with Replaced_one keyword
3 Text3 Replaced_with Replaced_three Replaced_keywords
PS。
-
Replaced 字符串已修复。所以你可以使用你喜欢的字符串。替换语句是这样的:
replace(sText, sKeyword, 'Replaced_' + sKeyowrd) - IdKey 在这种情况下是无用的,但它是我们真实数据库结构的一部分
这是我使用递归 CTE 失败的尝试:
DECLARE @Table1 TABLE( ID int, sText nvarchar(200))
DECLARE @Table2 TABLE( ID int, sKeyword nvarchar(10))
INSERT INTO @Table1 VALUES(1, 'Text with some keywords')
INSERT INTO @Table1 VALUES(2, 'Text2 with one keyword')
INSERT INTO @Table1 VALUES(3, 'Text3 with three keywords')
INSERT INTO @Table2 VALUES(1, 'some')
INSERT INTO @Table2 VALUES(1, 'keywords')
INSERT INTO @Table2 VALUES(2, 'one')
INSERT INTO @Table2 VALUES(3, 'with')
INSERT INTO @Table2 VALUES(3, 'keywords')
INSERT INTO @Table2 VALUES(3, 'three')
;WITH CTE AS(
SELECT ID, sText FROM @Table1
UNION ALL
SELECT c.ID, CAST(REPLACE(sText, sKeyword, 'New_' + sKeyword) AS nvarchar(200)) FROM CTE c
INNER JOIN @Table2 t2 ON t2.ID = c.ID
)
SELECT * FROM CTE
结果是一个无限循环,它不会停止。
任何帮助将不胜感激
【问题讨论】:
-
“Replaced_some”从何而来?它是在表格中,还是只是在每个关键字之前添加“Replaced_”?请发布您使用递归 CTE 的尝试,以便我们对其进行调试。
-
我想我可以看到您将替换的内容,但看不到您将替换它的内容 with,这似乎是解决方案所必需的。
-
idKey 是干什么用的?
-
我编辑问题以使其更清晰。谢谢@KtX2SkD
-
请同时发布您解决此问题的尝试以及为什么它不起作用。
标签: sql sql-server sql-server-2008