SQL: заменить идентификатор в строке - PullRequest
1 голос
/ 25 января 2012

Вот сценарий -

У меня есть две таблицы Имена и предложения:

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

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

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

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

Любая помощь будет принята с благодарностью!

Спасибо.

Ответы [ 3 ]

1 голос
/ 25 января 2012

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

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

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 голосов
/ 25 января 2012

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

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)
0 голосов
/ 25 января 2012

Вы можете написать функцию, а затем выбрать с помощью этой функции.Но, как сказал JNK, я не уверен, как это сделать с двумя заменами.В моем вопросе и ответе ( SQL Server сменить шрифт в HTML-строке ) приведен пример замены одной строки другой с помощью функции.По сути, вы заменяете <1> набором выбора, а затем <2> набором выбора для каждого первого набора.

...