database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 5934 게시물 읽기
No. 5934
쿼리 질문 MS-SQL 2008 - 문자열 분할.. 좀 복잡해요
작성자
우세연(w2share)
작성일
2011-08-15 12:55ⓒ
2011-08-15 20:07ⓜ
조회수
7,344

한 컬럼에 쉼표로 나눠진 여러 값이 들어 있는데

다음과 같이 나오게 되었으면 좋겠어요. 각 컬럼에서 첫번째 값이 FIELD1 으로, 두번째 값이 FIELD2 로 들어가고 만약 값이 두개 이상이면 첫번째 값이 FIELD1, 다음 값들이 다음줄의 FIELD2 로...

예를 들면

 

COLUMN1
123, 456, 7890, abcd
375, 489, 958
499, 589

 

이걸

FIELD1 FIELD2
123 456
123 7890
123 abcd
375 489
375 958
499 589

요렇게 나올수 있게... 이게 쿼리만으로 가능한가요? 고수님들 부탁드려요...

 사용 DB 는 SQL 2008 입니다.

이 글에 대한 댓글이 총 3건 있습니다.

우선 NUMS 라는 테이블을 생성하시구요

CREATE TABLE [dbo].[NUMS](
 [ID] [int] NOT NULL,
 CONSTRAINT [PK_NUMS] PRIMARY KEY CLUSTERED
(
 [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

이 NUMS 라는 테이블에는 문자열에 길이에 따라서 ID를 적당히 생성하시면 되는데

저는 200까지만 가정해서 넣었습니다

ID
 
1
 
2
...
200

 

COLUMN1
123, 456, 7890, abcd
375, 489, 958
499

위에  table을  tb 라고 가정하면

 

select Field1,Field2
from tb cross apply

( SELECT   substring ( tb.COLUMN1, 1, CHARINDEX(',',  tb.COLUMN1+',',1)-1) as Field1,
          case when CHARINDEX(',', tb.COLUMN1,1) = 0 then '' else  substring (  tb.COLUMN1, id , CHARINDEX(',', tb.COLUMN1+',',ID)-(ID)) end AS  Field2
  FROM   NUMS  WHERE  ID <= LEN(  tb.COLUMN1)
  AND SUBSTRING (','+ tb.COLUMN1,ID,1) = ',' and (ID <> 1 or CHARINDEX(',', tb.COLUMN1,1) = 0 ))  as temp 

이 쿼리를 실행 시키시면  원하는 결과가 나오실겁니다

 

서정록님이 2011-08-16 10:11에 작성한 댓글입니다. Edit

 와... 서정록님 정말 대단하세요... 

다들 쿼리가지고는 불가능하다고, 프로그램을 해야 할거라고들 했는데...

서정록님이 써주신걸로 정말 잘 되네요!! 감사합니다!!

우세연(w2share)님이 2011-08-16 14:55에 작성한 댓글입니다.

IF OBJECT_ID('tbl') IS NOT NULL
 DROP TABLE tbl
GO

CREATE TABLE tbl
(
 column1 VARCHAR(MAX)
)
GO

INSERT INTO tbl
SELECT '123, 456, 7890, abcd' UNION ALL
SELECT '375, 489, 958'    UNION ALL
SELECT '499, 589'
GO

SELECT SUBSTRING(a.column1,0,CHARINDEX(', ',column1+', ',1)) AS Field1
  , SUBSTRING(a.column1,b.s,b.e-b.s) AS Field2
  FROM tbl a
 CROSS APPLY ( SELECT number AS s, CHARINDEX(', ',a.column1+', ',number+1) AS e
     FROM [master].dbo.spt_values
    WHERE [type] ='p'
      AND number = CHARINDEX(', ',', '+a.column1,number) ) b
 WHERE s > 1
GO

원론님이 2011-08-16 16:37에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
5937운영데이터를 개발서버로 이관하려고 합니다.2008 R2버전입니다. [2]
자민
2011-08-18
6174
5936Week관련 [1]
박판규
2011-08-17
6595
5935형변환
오공
2011-08-17
6405
5934쿼리 질문 MS-SQL 2008 - 문자열 분할.. 좀 복잡해요 [3]
우세연
2011-08-15
7344
5932자동증가로 설정하면 몇건까지 증가되나요 [1]
김길동
2011-08-12
7001
5931두개의 문자열 비교하여, 위치별 틀린 갯수 구하기 [1]
dol
2011-08-11
7502
5930한가지 더 질문드리겠습니다. 여러로우의 텍스트값을 하나의 로우에 붙여서 출력하고자 합니다. [3]
최명근
2011-08-10
7337
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다