[SQL] 여러 행에 걸쳐 분할 값 [중복]
SQL여러 행에 걸쳐 분할 값 [중복]
내가 저장 프로 시저에서 다음과 같은 출력이 여러 행으로 값을 분리하는 가장 좋은 방법을 궁금 해서요.
reference name subjects subjectstitle
LL9X81MT Making and Decorating Pottery F06,F27,F38 NULL
나는 쉼표의에서 주제 필드를 손질하고 데이터가 다음과 같은 것 때문에 세 행을 통해 정보를 복제 할 필요가있다.
reference name subjects subjectstitle
LL9X81MT Making and Decorating Pottery F06 NULL
LL9X81MT Making and Decorating Pottery F27 NULL
LL9X81MT Making and Decorating Pottery F38 NULL
나는 설정이 SP의를에 MS SQL 서버 2008을 사용하고 그냥 주제가 필드 분할하는 방법에 대한 몇 가지 도움이 필요 해요.
감사,
해결법
-
==============================
1.이 유사 테이블 반환 분할 기능의 일종을 사용하기를 원할 것입니다 :
이 유사 테이블 반환 분할 기능의 일종을 사용하기를 원할 것입니다 :
create FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1)) returns @temptable TABLE (items varchar(MAX)) as begin declare @idx int declare @slice varchar(8000) select @idx = 1 if len(@String)<1 or @String is null return while @idx!= 0 begin set @idx = charindex(@Delimiter,@String) if @idx!=0 set @slice = left(@String,@idx - 1) else set @slice = @String if(len(@slice)>0) insert into @temptable(Items) values(@slice) set @String = right(@String,len(@String) - @idx) if len(@String) = 0 break end return end;
그런 다음 사용하는 외부 yourtable로 가입 신청을 할 수 있습니다 :
select t1.reference, t1.name, t1.subjectstitle, i.items subjects from yourtable t1 outer apply dbo.split(t1.subjects, ',') i
이 같은 결과를주기 :
| REFERENCE | NAME | SUBJECTSTITLE | SUBJECTS | ------------------------------------------------------------------------ | LL9X81MT | Making and Decorating Pottery | (null) | F06 | | LL9X81MT | Making and Decorating Pottery | (null) | F27 | | LL9X81MT | Making and Decorating Pottery | (null) | F38 |
데모와 SQL 바이올린을 참조하십시오
당신이 분할 기능이없는이 작업을 수행하려면, 당신은 CTE를 사용할 수 있습니다 :
;with cte (reference, name, subjectstitle, subjectitem, subjects) as ( select reference, name, subjectstitle, cast(left(subjects, charindex(',',subjects+',')-1) as varchar(50)) subjectitem, stuff(subjects, 1, charindex(',',subjects+','), '') subjects from yourtable union all select reference, name, subjectstitle, cast(left(subjects, charindex(',',subjects+',')-1) as varchar(50)) , stuff(subjects, 1, charindex(',',subjects+','), '') subjects from cte where subjects > '' ) select reference, name, subjectstitle, subjectitem from cte
데모와 SQL 바이올린을 참조하십시오
-
==============================
2.이것은 분할 기능이없는 할 것
이것은 분할 기능이없는 할 것
SELECT T1.reference, T1.name, T2.my_Splits AS subjects, T1.subtitile FROM ( SELECT *, CAST('<X>'+replace(T.subjects,',','</X><X>')+'</X>' as XML) as my_Xml FROM [yourTable] T ) T1 CROSS APPLY ( SELECT my_Data.D.value('.','varchar(50)') as my_Splits FROM T1.my_Xml.nodes('X') as my_Data(D) ) T2
from https://stackoverflow.com/questions/13159526/split-values-over-multiple-rows by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 오류 : ORA-01861 : 리터럴 형식 문자열 01861과 일치하지 않습니다 (0) | 2020.05.02 |
---|---|
[SQL] 같은보기에서 다른 열을 계산하는 계산 된 열을 사용하는 방법 (0) | 2020.05.02 |
[SQL] PHP는 변수를 사용하여 동적 MySQL의 쿼리 만들기 (0) | 2020.05.02 |
[SQL] 이름 데이터베이스 디자인 당신이 선호하는 표기법 그 이유는 무엇입니까? (0) | 2020.05.02 |
[SQL] SQL 서버 업데이트 트리거 만 수정하기 필드 (0) | 2020.05.02 |