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 5458 게시물 읽기
No. 5458
MS-SQL의 문자열을 구분자로하여 행으로 변환하기
작성자
조필래(jossypr)
작성일
2009-11-21 10:57
조회수
10,970

MS-SQL에서

아래 TABLE의 CC칼럼의 내용을 쿼리하여 쿼리결과처럼 각각의 값을 

행으로 나타내는 방법이 없나요

- CC 칼럼의 문자열 구분자는 ","입니다.



TABLE 내용  

AA       BB   CC

203960  001  1953-008736,1953-008737,1953-008738

205630  002  1991-004919,1991-006162,1991-006173,1991-083190,1989-033175,1989-035637



  

쿼리 결과 구하기  

AA       BB   CC

203960  001  1953-008736

203960  001  1953-008737

203960  001  1953-008738

205630  002  1991-004919

205630  002  1991-006162

205630  002  1991-006173

205630  002  1991-083190

205630  002  1989-033175

205630  002  1989-035637

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

CREATE PROCEDURE TestSplit
AS
BEGIN
 -- 변수 및 임시 테이블 선언
 DECLARE @AA CHAR(10), @BB CHAR(3), @CC CHAR(255), @Sub_CC CHAR(20);
 DECLARE @TestT TABLE ( AA CHAR(10), BB CHAR(3), CC CHAR(20) );

 -- 커서 선언
 DECLARE t_cursor CURSOR
 FOR SELECT * FROM test;

 OPEN t_cursor;

 FETCH NEXT FROM t_cursor INTO @AA, @BB, @CC;
 WHILE @@FETCH_STATUS = 0
 BEGIN
  -- 콤마가 있는 경우 분할해가며 INSERT
  WHILE CHARINDEX(',', @CC) <> 0
  BEGIN
   SET @Sub_CC = SUBSTRING(@CC, 1, CHARINDEX(',', @CC) - 1);
   SET @CC = SUBSTRING(@CC, CHARINDEX(',', @CC)+1, LEN(@CC));
   INSERT INTO @TestT VALUES ( @AA, @BB, @Sub_CC );
  END
  -- 콤마가 없는 경우나 마지막 값을 INSERT
  INSERT INTO @TestT VALUES ( @AA, @BB, @CC );
  FETCH NEXT FROM t_cursor INTO @AA, @BB, @CC;
 END

 CLOSE t_cursor;
 DEALLOCATE t_cursor;

 -- 임시 테이블 리턴
 SELECT * FROM @TestT;
END
GO


참고로 데이터가 많거나 콤마가 포함된 CC 컬럼이 길면 굉장히 느린 프로시저 입니다. 주의해서 사용하시면 되겠습니다.

-- 이하는 실행 결과
-------------------------
203960     001 1953-008736        
203960     001 1953-008737        
203960     001 1953-008738        
205630     002 1991-004919        
205630     002 1991-006162        
205630     002 1991-006173        
205630     002 1991-083190        
205630     002 1989-033175        
205630     002 1989-035637        

박현우(lqez)님이 2009-11-24 21:18에 작성한 댓글입니다.
이 댓글은 2009-11-24 21:21에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
5470MS-SQL 2008, 사용자 계정 설정관련 [1]
조현철
2009-11-24
12029
5469[문의] index 생성 문의 드립니다. [1]
새벽소리
2009-11-24
6916
5468두 시간의 차이 값을 3시간 단위로 표시 [1]
박남춘
2009-11-24
6921
5458MS-SQL의 문자열을 구분자로하여 행으로 변환하기 [1]
조필래
2009-11-21
10970
5457[급질]XACT_ABORT 옵션이 OFF로 설정되어 있으므로 중첩 트랜잭션이 필요합니다
heman
2009-11-20
7896
5456XML 생성시 라인이 잘려 만들어 집니다.
김철령
2009-11-18
6418
54552005 32bit 에서 2008 64bit 접속후 [1]
권왕
2009-11-16
7452
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다