2015-03-23 6 views
0

Мне нужно преобразовать некоторые строки из этого формата:Добавить «-» в VARCHAR SQL

"1020202020" 

К

"1-0-2-0-2-0-2-0-2-0" 

Как я могу сделать это простым способом?

Благодаря

ответ

2

Каждый день я просыпаюсь и думаю про себя

;with cte as (
    select 
     '1020202020' inputstring, 
     convert(varchar(max),'') outputstring 
    union all 
    select 
     substring(inputstring,2,len(inputstring)), 
     outputstring + left(inputstring,1) + '-' + case when len(inputstring) = 2 then right(inputstring,1) else '' end 
    from cte 
    where len(inputstring) > 1 
) 
select top 1 outputstring from cte order by len(outputstring) desc 
+0

Принято через 10 секунд после его публикации ?? –

+0

Да! Скопируйте и вставьте в SSMS, и он работает! – Galma88

+0

Сделал небольшую регулировку. Не нужно «X» заполнить строку. –

0

Ваш вопрос остается неясным на точные правила для размещения дефисов. Итак, может быть какой-то умный метод, используя replace().

Для примера строки: «Что невозможно вещь, CTE сделать возможным сегодня»

select replace(replace(col, '02', '-0-2'), '20', '2-0') 
+0

На самом деле я думал, что это было просто, как _put дефиса между всеми characters_. Я думаю, [этот метод] (http://stackoverflow.com/a/6079259/284240) должен работать (с параметром 1 в качестве параметра) в сочетании с [this] (http://stackoverflow.com/a/6170551/284240). Однако последний дефис должен быть удален. –

0

Я бы продолжить так:

TRIM(TRAILING "-" FROM REPLACE("10203040", "0", "-0-")) 
+0

Что заставляет вас думать, что что-то особенное в нулях? – SamB

+1

ну и вопрос говорит: «... этот формат: 1020202020 ...» – Federico

0

Вот не-цикл/нерекурсивна решение. Мне было весело с REPLACE(), и это ОЧЕНЬ эффективно. Он может обрабатывать 100 000 строк менее чем за секунду, что, вероятно, лучше, чем любое циклическое или рекурсивное решение.

IF OBJECT_ID('strings') IS NOT NULL 
    DROP TABLE strings; 

CREATE TABLE strings (string BIGINT); 

--Populate the table 
WHILE(SELECT COUNT(*) FROM strings) < 100000 
BEGIN 
    INSERT INTO strings 
     SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL 
     SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL 
     SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL 
     SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL 
     SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 UNION ALL SELECT RAND() * 10000000000 
END 

--Add the hyphens with REPLACE() and cut off the extra hyphen at the end with SUBSTRING() 
SELECT SUBSTRING(
       REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(string, '0', '0-'),'1','1-'),'2','2-'),'3','3-'),'4','4-'),'5','5-'),'6','6-'),'7','7-'),'8','8-'),'9','9-'), 
       0, 
       LEN(string)*2 
       ) AS String 
FROM strings; 

Сокращенные Результаты:

String 
------------------------ 
5-6-1-2-9-4-9-0-8-1 
7-5-8-5-1-9-3-0-9 
2-2-4-7-6-1-5-7-6-9 
9-3-4-6-1-0-3-5-0 
9-9-5-3-6-8-8-7-8-9 
5-3-7-2-0-5-3-0-6 
8-4-0-8-9-8-9-4-5-0 
9-8-6-4-6-8-4-4-3-9 
6-6-5-8-2-8-7-3-9-2 
...