2015-10-20 2 views
4

Удалить повторяющиеся слова из ячейки столбца, например:Удалить повторяющиеся слова из ячейки столбца с помощью SQL

столбца данных это одно поле: «BLACKHEATH 0AA BLACKHEATH COLCHESTER CO2 0AA»

Но я хочу, как это, «Блэкхит "должен быть только один раз, если любая другая запись найдена, то она должна быть удалена

BLACKHEATH COLCHESTER CO2 0AA 

Я могу сделать это с помощью кода, но я понятия не имею, как удалить повторяющиеся слова с помощью SQL в SQL Server. Мне было поручено сделать это через SQL. Любая помощь будет оценена по достоинству.

+2

Какая СУБД вы используете? Postgres? Oracle? –

+0

Я хочу функцию на сервере Sql, –

+0

В SQL Server есть функция replace(), вы посмотрели на это? – Greg

ответ

2
declare @text varchar(max) = 'BLACKHEATH 0AA BLACKHEATH COLCHESTER CO2 0AA' 
declare @i int = 1; 
declare @nextCharacter varchar(max) 
declare @word varchar(max)='' 

declare @lastChar varchar(1) = substring(@text,len(@text),1) 
--select @lastChar 

declare @lastIndex varchar(max) = charindex(@lastChar,@text,len(@text)) 
select @lastIndex 
--select len(@text) 

create table #tmp (id int,word varchar(max)) 

while (@i <= len(@text)) 
begin 

    select @nextCharacter= substring(@text, @i, 1) 
    --select @nextCharacter,@i, @lastChar, len(@text) 

    if (@nextCharacter !=' ') 
     begin  
      select @word = @word + @nextCharacter 
     end 

    else 
     begin 
      insert into #tmp 
      values(@i,@word) 
      set @word='' 
     end 
     if (@i = len(@text) and @nextCharacter= @lastChar) 
     begin 
     insert into #tmp 
      values(@i,@word)      
     end 

    set @i = @i +1 

end; 

select id,word from #tmp order by id; 

WITH tblTemp as 
(
SELECT ROW_NUMBER() Over(PARTITION BY word ORDER BY id) 
    As RowNumber,* FROM #tmp 
) --select * from tblTemp 
select * into #tmp2 FROM tblTemp where RowNumber =1 

declare @newString varchar(max)='' 
select @newString = @newString +word+' ' from #tmp2 order by id 

select rtrim(@newString) 

drop table #tmp2 
drop table #tmp 
+0

Nice Спасибо Bro –

+0

Спасибо большое –

3

Если заказ не имеет значения, вы могли бы сделать это вполне достаточно легко:

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; 

Что идея здесь?

  1. dbo.SplitString функция разбивает строку на строки на основе разделителей (space в вашем случае). См. this article, чтобы найти функцию SplitString, которая наилучшим образом соответствует вашим потребностям.
  2. DISTINCT ключевое слово deleted dupes
  3. Используя 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 не справляется с текстовыми данными, поэтому я бы рекомендовал сделать это в коде, поскольку это может повлиять на вашу производительность.

-2
declare @text varchar(max) = 'BLACKHEATH 0AA BLACKHEATH COLCHESTER CO2 0AA' 
declare @i int = 1; 
declare @nextCharacter varchar(max) 
declare @word varchar(max)='' 

declare @lastChar varchar(1) = substring(@text,len(@text),1) 
--select @lastChar 

declare @lastIndex varchar(max) = charindex(@lastChar,@text,len(@text)) 
select @lastIndex 
--select len(@text) 

create table #tmp (id int,word varchar(max)) 

while (@i <= len(@text)) 
begin 

    select @nextCharacter= substring(@text, @i, 1) 
    --select @nextCharacter,@i, @lastChar, len(@text) 

    if (@nextCharacter !=' ') 
     begin  
      select @word = @word + @nextCharacter 
     end 

    else 
     begin 
      insert into #tmp 
      values(@i,@word) 
      set @word='' 
     end 
     if (@i = len(@text) and @nextCharacter= @lastChar) 
     begin 
     insert into #tmp 
      values(@i,@word)      
     end 

    set @i = @i +1 

end; 

--select id,word from #tmp order by id; 

WITH tblTemp as 
(
SELECT ROW_NUMBER() Over(PARTITION BY word ORDER BY id) 
    As RowNumber,* FROM #tmp 
) --select * from tblTemp 
select * into #tmp2 FROM tblTemp where RowNumber =1 

declare @newString varchar(max)='' 
select @newString = @newString +word+' ' from #tmp2 order by id 

select rtrim(@newString) as FromAddress 

drop table #tmp2 
drop table #tmp 

Пожалуйста, удалите идентификатор в пункте выбора.

Смежные вопросы