SQL:替换String中的ID

时间:2012-01-24 20:16:51

标签: sql string sql-server-2008 replace

这是情景 -

我有两张桌子名字&句:

Names                   Sentences
ID | Names              ID | Description                   
1  | Fox                1  | The <1> jumped over the <2>
2  | Narwhal            2  | The <2> sailed to the <3>
3  | Moon

我需要从Sentences表中返回所有描述,并将ID替换为Names表中相应的Name,例如

“狐狸跳过独角鲸”,“独角鲸航行到月球”。

我很难理解从哪里开始,理论上它似乎是一个简单的问题,但我对操纵字符串的知识是有限的。

非常感谢任何帮助!

感谢。

3 个答案:

答案 0 :(得分:1)

这至少应该让你开始。这很麻烦,因为你有多级替换,而且数据本身没有JOIN键。

这使用了两个CROSS JOIN和一堆字符串函数,因此非常低效。这在大型数据集上永远不会快速运行。

DECLARE @names table (id int, names varchar(100))
DECLARE @sent table (id int, descr varchar(1000))

INSERT INTO @names
VALUES
(1, 'Fox'),
(2, 'Narwhal'),
(3, 'Moon')

INSERT INTO @sent 
VALUES
(1, 'The <1> jumped over the <2>.'),
(2, 'The <2> sailed to the <3>.')

SELECT DISTINCT Filtered
FROM (SELECT Replace(REPLACE(descr, '<' + CAST(n.id as varchar) + '>', n.names), '<' + CAST(n2.id as varchar) + '>', n2.names) Filtered
      FROM @sent s, @names n, @names n2) x
WHERE Filtered NOT LIKE '%<%'

答案 1 :(得分:0)

您可以编写一个函数,然后选择使用该函数。但是,正如JNK所说,我不知道如何用两次替换来做到这一点。我的问题和回复(SQL Server change font in html string)给出了使用函数将一个字符串替换为另一个字符串的示例。你基本上是在替换'&lt; 1&gt;'选择集然后'&lt; 2&gt;'为每个第一组选择集。

答案 2 :(得分:0)

另一种可能以牺牲燃烧视网膜为代价更快的方法:

SELECT
LEFT(Description, CHARINDEX('<', Description)-1)
+ Name1
+ SUBSTRING(Description, CHARINDEX('>', Description) + 1, CHARINDEX('<', Description, CHARINDEX('<', Description) + 1) - CHARINDEX('>', Description) - 1)
+ Name2
FROM Sentences
JOIN Names AS Name1 ON Name1.ID = CAST(SUBSTRING(Description, CHARINDEX('<', Description) + 1, 1) AS INT)
JOIN Names AS Name2 ON Name2.ID = CAST(SUBSTRING(Description, CHARINDEX('<', Description, CHARINDEX('<', Description) + 1) + 1, 1) AS INT)