这是情景 -
我有两张桌子名字&句:
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,例如
“狐狸跳过独角鲸”,“独角鲸航行到月球”。我很难理解从哪里开始,理论上它似乎是一个简单的问题,但我对操纵字符串的知识是有限的。
非常感谢任何帮助!
感谢。
答案 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)