2012-01-24 3 views
1

Вот сценарий -SQL: Заменить идентификатор строки

У меня есть две таблицы Имена & Sentences:

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 

Мне нужно вернуть все Описания из таблицы предложений с идентификатором замененного с соответствующее имя из таблицы имен, например

«Фокс перепрыгнул через Нарвал», «Нарвал отплыл на Луну».

Я в шоке от того, с чего начать, теоретически это похоже на простую проблему, но мое знание манипулирования строками ограничено.

Любая помощь была бы высоко оценена!

Спасибо.

+0

Какую базу данных вы используете? – everton

+0

Btw, это не похоже на проблему, с которой вы можете справиться с SQL-запросами. Было бы лучше обработать его в коде. – everton

+0

SQL Server 2008 – ephron

ответ

1

Это должно по крайней мере начать. Это бесполезно, потому что у вас есть многоуровневые замены, и нет ключа JOIN в самих данных.

Это использует два CROSS JOIN s и кучу строковых функций, поэтому это будет очень неэффективно. Это не будет работать быстро на большом наборе данных.

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 '%<%' 
+0

Спасибо JNK, к счастью, он предназначен для одноразового использования на работе и не собирается исполняться на большом наборе данных. – ephron

+0

Для небольшого набора это должно сработать. – JNK

0

Вы можете написать функцию, а затем выбрать, используя эту функцию. Но, как сказал JNK, я не уверен, как это сделать с двумя заменами. Мой вопрос и ответ (SQL Server change font in html string) дает пример замены одной строки на другую с помощью функции. Вы по существу заменяете '< 1>' набором выбора, а затем '< 2>' с набором для каждого из первого набора.

0

Другой подход, который может быть быстрее, за счет сжигания YR сетчатку:

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) 
Смежные вопросы