Member 11917248 Ответов: 4

SQL - как разделить строку на основе разделителя?


артикул

SER_ELECTR_003
SER_MACHRENTL_004
CI_BRI_0005
CI_CEM_00001
Это моя колонка

1)ТРЕБУЕМЫЙ РЕЗУЛЬТАТ

ITEMCODE             PART1  PART2     PART3
SER_ELECTR_003       SER    ELECT      003
SER_MACHRENTL_004    SER   MACHRENTL   004
CI_BRI_00005          CI     BRI      0005
CI_CEM_00001          CI     CEM      00001

Sanket Saxena

Почему?

Andy Lanng

Только не кричи. Это считается грубым и побудит людей отметить вопрос.

Как бы то ни было, Ваш вопрос не является полным. Потратьте некоторое время и используйте кнопку "улучшить вопрос", чтобы добавить еще немного деталей. Не делайте репостов.

Спасибо
Энди

4 Ответов

Рейтинг:
2

kirthiga S

С помощью КТР можно

DECLARE @table TABLE(Keywords varchar(100))
insert into @table values('SER_ELECTR_003')
;with cte as (
select Keywords,substring(Keywords,0,charindex('_',Keywords))Key1 
	,SUBSTRING(Keywords,charindex('_',Keywords)+1,LEN(Keywords)-charindex('_',Keywords))Key2
from @table
)
select Keywords,Key1,substring(Key2,0,charindex('_',Key2))Key2
	,SUBSTRING(Key2,charindex('_',Key2)+1,LEN(Key2)-charindex('_',Key2))Key3
from cte


Nelek

ЗДЕСЬ ОТЧЕТ НЕ НУЖЕН:

Этот пользователь ответил, не глядя на дату, но ничего не имеет отношения к злоупотреблению. "Не-ответ", который вернул этот старый вопрос на свет, был № 3 (он скоро будет взорван ядерным оружием)

Не сообщайте об этом решении, так как оно полностью законно (правильно или неправильно, я не смешиваю себя с этим)

Nelek

@Kirthiga S, на всякий случай, если вам интересно... мой другой комментарий заключается в том, чтобы защитить вас и ваш ответ от того, что он считается злоупотреблением (охота за репутацией)

Рейтинг:
1

Duncan Edwards Jones

Во первых creaste родовое "расщеплять"[^] функция, вот так:-

CREATE FUNCTION dbo.fnSplit(
    @sInputList VARCHAR(8000) -- List of delimited items
  , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items
) RETURNS @List TABLE (item VARCHAR(8000))

BEGIN
DECLARE @sItem VARCHAR(8000)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
 BEGIN
 SELECT
  @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
  @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))
 
 IF LEN(@sItem) > 0
  INSERT INTO @List SELECT @sItem
 END

IF LEN(@sInputList) > 0
 INSERT INTO @List SELECT @sInputList -- Put the last item in
RETURN
END
GO


Затем используйте его в своем запросе например как:-
select *
from fnSplit('SER_ELECTR_003', '_') 


Member 11917248

ХАЙ СПАСИБО ЗА ОТВЕТ, РАЗВЕ ЭТО НЕВОЗМОЖНО РЕШИТЬ ПРОСТЫМ СПОСОБОМ БЕЗ ИСПОЛЬЗОВАНИЯ ФУНКЦИЙ. МНЕ НУЖНО, ЧТОБЫ ВЕСЬ КОЛОМН ИЗМЕНИЛСЯ, НЕ ДАВАЯ НИКАКОГО ВКЛАДА

Duncan Edwards Jones

Насколько я могу судить, нет ( http://www.bing.com/search-что?q=sql+server+split+string )

Maciej Los

5ed!

Рейтинг:
1

Maciej Los

Что касается комментария ОП:

Член 11917248 написал:
РАЗВЕ ЭТО НЕВОЗМОЖНО РЕШИТЬ ПРОСТЫМ СПОСОБОМ БЕЗ ИСПОЛЬЗОВАНИЯ ФУНКЦИИ


Да, можно получить результат с помощью CTE: получите 2-ю и 3-ю строки, разделив длинную строку с помощью T-Sql[^]


Рейтинг:
1

Member 13958363

Привет, можно ли это сделать в колонке мудро?