select
A
FROM B
! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000004 | 10000005 | 10000006 | 10000017 |
! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000279 | 10000280 | 10000281 | 10000282 |
! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000402 | 10000403 | 10000404 |
! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000279 | 10000280 | 10000281 | 10000284 |
! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000279 | 10000288 | 10000289 | 10000290 |
! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000402 | 10000403 | 10000420 | 10000421 |
! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000004 | 10000005 | 10000006 | 10000017 |
! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000004 | 10000005 | 10000006 | 10000017 |
! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000502 | 10000503 | 10000504 | 10000506 |
! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000004 | 10000005 | 10000006 | 10000007 |
! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000004 | 10000005 | 10000006 | 10000007 |
! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000004 | 10000005 | 10000006 | 10000009 |
다음과같은 데이터가 있다고 가정하고 여기서 | 기준으로 split 하여 7번째의 값인 10000003 만 뽑아 오고 싶은데
어떻게하면 처리할수있을까요?
-- Oracle 의 INSTR 은 4번째 인자로 몇번째 값을 가져올지 지정이 가능한데. -- MSSQL 의 CHARINDEX 는 인자가 3개 뿐이라 지정이 안되어 불편하네요. -- MSSQL -- SELECT a , x -- 6번째 구분자 위치 , CHARINDEX('|', a, x+1) y -- 7번째 구분자 위치 , TRIM(SUBSTRING(a, x+1, CHARINDEX('|', a, x+1) - x - 1)) z FROM (SELECT a , CHARINDEX('|', a , CHARINDEX('|', a , CHARINDEX('|', a , CHARINDEX('|', a , CHARINDEX('|', a , CHARINDEX('|', a )+1)+1)+1)+1)+1 ) x FROM b ) c ;
MSSQL이 아직 정상적인 Split 은 안되는거 같고, 2016 이상이면 아쉬운대로 JSON 형식으로 가능할꺼 같아요.
-- MSSQL 2016 이상 OPENJSON : 테이블 데이터 처리 WITH BB ( A )AS ( SELECT '! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000004 | 10000005 | 10000006 | 10000017 | ' UNION ALL SELECT '! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000279 | 10000280 | 10000281 | 10000282 | ' UNION ALL SELECT '! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000402 | 10000403 | 10000404 | ' UNION ALL SELECT '! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000279 | 10000280 | 10000281 | 10000284 | ' UNION ALL SELECT '! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000279 | 10000288 | 10000289 | 10000290 | ' UNION ALL SELECT '! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000402 | 10000403 | 10000420 | 10000421 | ' UNION ALL SELECT '! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000004 | 10000005 | 10000006 | 10000017 | ' UNION ALL SELECT '! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000004 | 10000005 | 10000006 | 10000017 | ' UNION ALL SELECT '! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000502 | 10000503 | 10000504 | 10000506 | ' UNION ALL SELECT '! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000004 | 10000005 | 10000006 | 10000007 | ' UNION ALL SELECT '! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000004 | 10000005 | 10000006 | 10000007 | ' UNION ALL SELECT '! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000004 | 10000005 | 10000006 | 10000009 | ' ) SELECT TRIM(JTbl.[value]) AS [7번째] FROM BB CROSS APPLY OPENJSON ('["'+ REPLACE(A, '|', '","') +'"]') as JTbl WHERE [key] = 6 -- 0 부터 시작 -- 개별 문자열 일때 SELECT TRIM(JTbl.[value]) AS [값] FROM OPENJSON('["'+ REPLACE('! | ! | ! | ! | 10000001 | 10000002 | 10000003 | 10000279 | 10000280 | 10000281 | 10000282 | ', '|', '","') +'"]') as JTbl WHERE [key] = 6 -- 0 부터 시작