2009-10-20 3 views
3

누군가 나를 도울 수 있는지 궁금합니다.tsql function split string

cat1 cat1descr  cat2 cat2descr  cat3 cat3descr 
---------------------------------------------------------------- 
00 Not especified null null   null null 
01 Global WM&BB 05  Operations null null 
01 Global WM&BB 05  Operations 01  Operations n/a 

결과는 항상 6 열

이있을 것이다 :이 같은 결과를 얻을 필요가

1) 00 Not specified 
3) 01-05 Global WM&BB | Operations 
2) 02-05-01 Global WM&BB | Operations | Operations n/a 

:

나는 같은 주어진 값을 분할하는 TSQL 기능이 필요합니다 select funcX ('00 지정되지 않음');

cat1 cat1descr  cat2 cat2descr  cat3 cat3descr 
---------------------------------------------------------------- 
00 Not especified null null   null null 
+0

어떤 버전의 SQL Server가 있습니까? – MartW

+0

http://stackoverflow.com/questions/2647/split-string-in-sql – tster

답변

0

당신은 @In 당신이 구문 분석하려는 문자열의 값이면이 PATINDEX와 문자열

0

를 사용하여 수행 할 수 있습니다,이 시도 :

Select 
    Case When firstDash = 0 Then zz.sKey 
     Else left(zz.sKey, FirstDash-1) End cat1, 
     Ltrim(RTrim(Case When firstPipe = 0 Then zz.Vals 
     Else Left(zz.Vals, firstPipe -1) End)) ca1Desc, 
    Case When firstDash = 0 Then Null 
     When secondDash = 0 
      Then SubString(zz.sKey, FirstDash+1, Len(zz.skey)) 
     Else SubString(zz.sKey, FirstDash+1, secondDash-firstDash-1) End cat2, 
     Ltrim(RTrim(Case When firstPipe = 0 Then Null 
     When secondPipe = 0 
      Then SubString(zz.Vals, firstPipe+1, Len(zz.Vals)) 
     Else SubString(zz.Vals, firstPipe+1, 
         secondPipe-firstPipe-1) End)) cat2Desc, 
    Case When secondDash > 0 
     Then Substring(zz.sKey, secondDash+1, len(sKey)-seconddash) End cat3, 
      Ltrim(RTrim(Case When secondPipe > 0 
       Then Substring(zz.Vals, secondPipe+1, 
        len(Vals)-secondPipe) End)) cat3Desc 
    From (Select Z.sKey, Z.Vals, 
      charIndex('-', Z.skey) firstDash, 
      charIndex('-', Z.skey, 1 + charIndex('-', Z.skey)) secondDash, 
      charIndex('|', Z.Vals) firstPipe, 
     charIndex('|', Z.Vals, 1 + charIndex('|', Z.Vals)) secondPipe 
     From (Select Left(@In, CharIndex(' ', @In)-1) skey, 
       substring(@In, CharIndex(' ', @In)+ 1, Len(@In)) vals) Z) ZZ 
6

이 SQL에서 작동합니다 Server 2005 및 SQL Server 2008에서 사용합니다. 첫 번째 숫자 시퀀스가 ​​1, 2 또는 3의 2 자리 그룹으로 고정되어 있다고 가정했습니다. 더 적은 수의 계단식 CTE로이 작업을 수행 할 수 있지만 SUBSTRING/CHARINDEX/LEN 구문을 사용하여 빠르게 읽고 디버그하기가 매우 어려워집니다.

DECLARE @foo TABLE 
(
    bar VARCHAR(4000) 
); 

INSERT @foo(bar) SELECT '00 Not specified' 
UNION ALL SELECT '01-05 Global WM&BB | Operations' 
UNION ALL SELECT '02-05-01 Global WM&BB | Operations | Operations n/a'; 


WITH split1 AS 
(
    SELECT 
     n = SUBSTRING(bar, 1, CHARINDEX(' ', bar)-1), 
     w = SUBSTRING(bar, CHARINDEX(' ', bar)+1, LEN(bar)), 
     rn = ROW_NUMBER() OVER (ORDER BY bar) 
    FROM 
     @foo 
), 
split2 AS 
(
    SELECT 
     rn, 
     cat1 = LEFT(n, 2), 
     wl = RTRIM(SUBSTRING(w, 1, 
      COALESCE(NULLIF(CHARINDEX('|', w), 0)-1, LEN(w)))), 
     wr = LTRIM(SUBSTRING(w, NULLIF(CHARINDEX('|', w),0) + 1, LEN(w))), 
     cat2 = NULLIF(SUBSTRING(n, 4, 2), ''), 
     cat3 = NULLIF(SUBSTRING(n, 7, 2), '') 
    FROM 
     split1 
), 
split3 AS 
(
    SELECT 
     rn, 
     cat1descr = wl, 
     cat2descr = RTRIM(SUBSTRING(wr, 1, 
       COALESCE(NULLIF(CHARINDEX('|', wr), 0)-1, LEN(wr)))), 
     cat3descr = LTRIM(SUBSTRING(wr, 
       NULLIF(CHARINDEX('|', wr),0) + 1, LEN(wr))) 
    FROM 
     split2 
) 
SELECT 
    s2.cat1, s3.cat1descr, 
    s2.cat2, s3.cat2descr, 
    s2.cat3, s3.cat3descr 
FROM split2 AS s2 
INNER JOIN split3 AS s3 
ON s2.rn = s3.rn;