Если заказ не имеет значения, вы могли бы сделать это вполне достаточно легко:
DECLARE @string VARCHAR(100) = 'BLACKHEATH 0AA BLACKHEATH COLCHESTER CO2 0AA';
SELECT @string AS Source
, LTRIM((
SELECT DISTINCT ' ' + column1 AS [text()]
FROM dbo.GetTableFromList(@string, ' ')
FOR XML PATH('')
)) AS UniqueWords;
Что идея здесь?
dbo.SplitString
функция разбивает строку на строки на основе разделителей (space
в вашем случае). См. this article, чтобы найти функцию SplitString, которая наилучшим образом соответствует вашим потребностям.
DISTINCT
ключевое слово deleted dupes
- Используя
FOR XML PATH('')
, мы объединяем их вместе.
Результат:
╔═══════════════════════════════════════════════╦═══════════════════════════════╗
║ Source ║ UniqueWords ║
╠═══════════════════════════════════════════════╬═══════════════════════════════╣
║ BLACKHEATH 0AA BLACKHEATH COLCHESTER CO2 0AA ║ 0AA BLACKHEATH CO2 COLCHESTER ║
╚═══════════════════════════════════════════════╩═══════════════════════════════╝
Если вам необходимо поддерживать порядок, вы должны были бы создать функцию, которая хранит ваши условия в первоначальном порядке (возможно, с использованием ROW_NUMBER()) и имеет порядок для каждого индивидуального (удалить обманы), а затем вы можете рассчитать, где должны быть слова. Я не стал создавать, но это должен вывести такой результат для вашей строки:
╔═══════════╦═══════════╦════════════╗
║ WordOrder ║ TermOrder ║ Term ║
╠═══════════╬═══════════╬════════════╣
║ 1 ║ 1 ║ BLACKHEATH ║
║ 2 ║ 1 ║ 0AA ║
║ 3 ║ 2 ║ BLACKHEATH ║
║ 4 ║ 1 ║ COLCHESTER ║
║ 5 ║ 1 ║ CO2 ║
║ 6 ║ 2 ║ 0AA ║
╚═══════════╩═══════════╩════════════╝
, которые могут быть повторно использованы в таком запросе (@Splitted
это таблица выше):
SELECT @string AS Source
, LTRIM((
SELECT ' ' + Term AS [text()]
FROM @Splitted
WHERE TermOrder = 1
ORDER BY WordOrder
FOR XML PATH('')
)) AS UniqueWords;
Он это выводит данные строка:
╔═══════════════════════════════════════════════╦═══════════════════════════════╗
║ Source ║ UniqueWords ║
╠═══════════════════════════════════════════════╬═══════════════════════════════╣
║ BLACKHEATH 0AA BLACKHEATH COLCHESTER CO2 0AA ║ BLACKHEATH 0AA COLCHESTER CO2 ║
╚═══════════════════════════════════════════════╩═══════════════════════════════╝
PS Почему вам было поручено сделать это в SQL? SQL Server не справляется с текстовыми данными, поэтому я бы рекомендовал сделать это в коде, поскольку это может повлиять на вашу производительность.
Какая СУБД вы используете? Postgres? Oracle? –
Я хочу функцию на сервере Sql, –
В SQL Server есть функция replace(), вы посмотрели на это? – Greg