이 고안 한 수와 빠른도 될 수 최단 및 판독 문자열 투 로우 스플리터이다.
함수 대신 순수 CTE를 사용하는 경우를 예로 들어 보겠습니다.
함수를 통한 로우 생성기 (루프 또는 CTE를 사용하여 구현 될 수 있음)는 여전히 가로 조인을 사용해야합니다 (DB2 및 Sybase의 경우 기능, LATERAL 키워드 사용; SQL Server에서 이것은 CROSS APPLY 및 OUTER APPLY와 유사 함) 함수에 의해 생성 된 분할 된 행을 주 테이블에 조인합니다.
순수 CTE 접근법은 함수 접근보다 빠를 수 있습니다. 속도 측정이 참 빠른 경우 단지 다른 솔루션에 비해 이것의 실행 계획을 확인하지만 프로파일에있다 :
with Pieces(theId, pn, start, stop) AS
(
SELECT id, 1, 1, charindex(';', member)
from tbl
UNION ALL
SELECT id, pn + 1, stop + 1, charindex(';', member, stop + 1)
from tbl
join pieces on pieces.theId = tbl.id
WHERE stop > 0
)
select
t.id, t.name,
word =
substring(t.member, p.start,
case WHEN stop > 0 THEN p.stop - p.start
ELSE 512
END)
from tbl t
join pieces p on p.theId = t.id
order by t.id, p.pn
출력 :
ID NAME WORD
1 jacky a
1 jacky b
1 jacky c
2 jason e
3 kate i
3 kate j
3 kate k
4 alex (null)
자료 논리가 여기 소스 : T-SQL: Opposite to string concatenation - how to split string into multiple records
라이브 테스트 : http://www.sqlfiddle.com/#!3/2355d/1
Unpivot은 MSSQL 및 오라클에서 찾고있는 명령입니다. – xQbert
@xQbert - 생각하지 않습니다. unpivot은 기능을 분할했지만, 내가 잘못 될 수 있습니다 ... –