Замена нескольких запятых на одну запятую в MS SQL - PullRequest
0 голосов
/ 06 июня 2018

Как заменить последовательные запятые в столбце одной запятой в MS SQL?

Например, у меня есть данные типа

 a,,,,b,,,c,,,,,,
 d,e,,,f,,,,,,g,,  

Я хочу, чтобы это обрабатывалось в следующем формате:

 a,b,c,
 d,e,f,g,

Предлагаемый дубликат Использовать SQL для замены нескольких запятых в строке одной запятой , предназначен для Oracle.Это вопрос по SQL Server.

Ответы [ 7 ]

0 голосов
/ 06 июня 2018

Хотя есть очень хорошие ответы (лично я склонен к lad2025), я хотел бы опубликовать другой подход (особенно в качестве дополнения к ответу ДрувДжоши)

DECLARE @tbl TABLE(s VARCHAR(100))
INSERT INTO @tbl VALUES('d,e,,,f,,,,,,g,,')
                      ,('a,,,,b,,,c,,,,,,');

SELECT CAST('<x>'+REPLACE(s,',','</x><x>')+'</x>' AS XML)
              .query('for $x in /x[text()]
                      return
                      <x>
                      {
                      concat($x, ",")
                      }
                      </x>
                      ')
              .value('.','nvarchar(max)') AS result
FROM @tbl;

Краткое объяснение:

В решении используется известный XML трюк для разделения строки.Остальное XQuery.Предикат /x[text()] уменьшит узлы до узлов с контентом.Они будут воссозданы с добавлением запятой..value() с XPath, равным ., вернет одну единственную строку всего содержимого в XML.

0 голосов
/ 25 июня 2018

Это то, что я сделал.

выберите заменить (заменить (заменить ('a ,,, b ,,, c, d, e ,,,, f', ',', '<>'),'> <',' '),' <> ',', ')

0 голосов
/ 06 июня 2018

Если у вас может быть неизвестное количество запятых, я бы порекомендовал разделитель, используя путь XML, как показано ниже.

Предполагая, что у вас есть таблица T со столбцом c см. также рабочую демонстрацию

Объяснение в виде комментариев

/* first we split out each letter from each column using XML Path after replacing commas with empty nodes */
; with cte as (
select
id,s 
from 
(
    select 
        id, 
        xmldata=cast('<x>'+replace(c,',','</x><x>')+'</x>' as xml) -- conversion to XML from varchar
    from t
 )A
cross apply
( 
    select 
       s = data.D.value('.','varchar(100)')
         FROM 
      A.xmldata.nodes('x') AS data(D)

 )c
 where s <>''-- filter out empty nodes i.e. commas
    )
  /* Now we join back results from CTE by adding single comma between letters*/
  select distinct id, stuff
  ((select ','+ s 
    from cte c1 
    where c1.id =c2.id
    for xml path ('')),1,1,'')
      from cte c2 
0 голосов
/ 06 июня 2018

Попробуйте этот скрипт, который устраняет пробел, несколько запятых и дает одну запятую, отделенную в результате

DECLARE @tbl AS TABLE (data nvarchar(max))
INSERT INTO @tbl
SELECT 'a,,,,b,,,c,,,,,,  ,,,,  ,,,   ,, ,,,,,d,,,,,,,,      ,, d,e,,,f,,,,,,g,,'

;WITH CTE
AS
(
SELECT data
       ,CAST(LEFT(data,1) AS VARCHAR(10)) AS Letter
       ,RIGHT(Data,LEN(Data)-1) AS Remainder
FROM @tbl
WHERE LEN(data)>1   
UNION ALL
SELECT data
       ,CAST(LEFT(Remainder,1) AS VARCHAR(10)) AS Letter
       ,RIGHT(Remainder,LEN(Remainder)-1) AS Remainder
FROM CTE
WHERE LEN(Remainder)>0
)
SELECT STUFF((SELECT ', '+ Letter 
FROM
(
 SELECT Letter
 FROM CTE
 WHERE Letter <>',' AND Letter <>''
)dt FOR XML PATH ('')),1,1,'')  AS RequiredOutPut 

Результат

RequiredOutPut
------------------
 a, b, c, d, d, e, f, g

Демонстрация: http://rextester.com/VEZS31565

0 голосов
/ 06 июня 2018

Вы можете использовать простые REPLACE:

SELECT c, REPLACE(REPLACE(REPLACE(c, ',', '~,'), ',~', ''), '~,', ',')
FROM tab;

DBFiddle Demo

Выход:

┌──────────────────┬──────────┐
│        c         │  result  │
├──────────────────┼──────────┤
│ a,,,,b,,,c,,,,,, │ a,b,c,   │
│ d,e,,,f,,,,,,g,, │ d,e,f,g, │
└──────────────────┴──────────┘

Обратите внимание, что этот подход не зависит от диалекта SQL и должен работать с MySQL / Oracle / PostgreSQL /...

0 голосов
/ 06 июня 2018

Это довольно легко сделать с помощью CTE:

declare @s varchar(20) = 'a,,,,b,,,c,,,,,, d,e,,,f,,,,,,g,,'

;with cte as (
    select replace(@s, ',,', ',') [s], 1 [rn]
    union all
    select replace(s, ',,', ',') [s], [rn] + 1
    from cte
    where LEN(s) - LEN(replace(s, ',,', '')) > 0
)

select top 1 @s = s from cte
order by rn desc

select @s
0 голосов
/ 06 июня 2018

используйте

    SELECT 
        REGEXP_REPLACE(
            REGEXP_REPLACE('Hi,,How are you? Fine, thanks ,, ,  ,,,, , James,Arden.', ', | ,', ','), --Replace ', ' and ' ,' with ','
        ',{1,}', ', ') single_comma_text --Replace one or more comma with comma followed by space
FROM DUAL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...