[MSSQL] 컬럼에 구분자로 입력된 값 IN절로 만들기 0 5 3,410

by 디비초보 [SQL Query] [2019.07.02 09:13:35]


안녕하세요 쿼리를 뽑아야 할일이 생겼는데 방법이 생각나지 않아 혹시 아시는분이 계실까 해서 질문남겨요

테이블 컬럼 코드값으로 콤마로 구분된 정보가 있습니다.

select시 컬럼값을 서브쿼리로 in절에 넣어서 한글화해서 뽑고싶은데 가능할까요?

 

목적은 엑셀 익스포트 하려고합니다. 한컬럼에 안나와도 되구요 ㅠ

 

예) code_code 컬럼에는 "AA11,AA12,AA13"의 형태로 문자 데이터 타입으로 입력되어있습니다.

AA11,AA12,AA13 코드화된 값을 "아아1,아아2,아아3" 이런형태로 뽑아내고 싶습니다.

단순 서브쿼리로 안될거 같긴 합니다.. 혹시 방법이 있긴 한걸까요?

select

ISNULL(selct code_name from CODE_TABLE WHERE code IN(code_code), code_code) AS code_name

from MY_TABLE

 

감사합니다.

by 르매 [2019.07.02 11:37:03]

SQLServer 2017 이상이라면 이런 식으로 풀 수 있습니다.

STRING_SPLIT()과 STRING_AGG() 용법을 살펴 보세요.

CREATE TABLE dbo.MY_TABLE (
  id int NOT NULL IDENTITY PRIMARY KEY,
  col1 nvarchar(10) NOT NULL,
  code_code varchar(50) NOT NULL
);

CREATE TABLE dbo.CODE_TABLE (
  code_code varchar(10) NOT NULL PRIMARY KEY,
  code_name nvarchar(10) NOT NULL
);

INSERT dbo.MY_TABLE (col1, code_code)
VALUES (N'홍길동', 'AA11,AA12,AA13'), (N'심청', 'AA12,AA13');
  
INSERT dbo.CODE_TABLE (code_code, code_name)
VALUES ('AA11', N'아아1'), ('AA12', N'아아2'), ('AA13', N'아아3');

 

WITH A AS (
    SELECT MT.id, STRING_AGG(CT.code_name, ',') AS code_name
    FROM MY_TABLE MT
        CROSS APPLY STRING_SPLIT(MT.code_code, ',') SS
        INNER JOIN CODE_TABLE CT ON CT.code_code = SS.value
    GROUP BY MT.id
)
SELECT MT.id, MT.col1, A.code_name
FROM MY_TABLE MT
    INNER JOIN A ON A.id = MT.id;

 


by 킬유머신 [2019.07.03 09:28:01]

불행하게도 SQL SERVER 2014버전이라서 STRING_AGG() 함수를 사용 못하네요 ㅠㅠ

말씀해주신 방법으로 문자 나누기 하면 잘 될것 같은데 아쉽네요

 

혹시 함수를 사용하지 않고는 불가능할까요? 

 

답변 감사합니다 ^^


by 마농 [2019.07.03 11:12:02]
WITH code_table AS
(
SELECT 'AA11' code, '아아1' code_name
UNION ALL SELECT 'AA12', '아아2'
UNION ALL SELECT 'AA13', '아아3'
)
, my_table AS
(
SELECT 'AA11,AA12,AA13' code_code
UNION ALL SELECT 'AA11,AA13'
UNION ALL SELECT 'AA13,AA12'
)
SELECT code_code
     , STUFF(
       (SELECT ',' + code_name
          FROM code_table
         WHERE CHARINDEX(code, a.code_code) > 0
         ORDER BY CHARINDEX(code, a.code_code)
           FOR XML PATH('')
        ), 1, 1, '') code_name
  FROM my_table a
;
-- http://gurubee.net/article/55512

 


by 마농 [2019.07.03 11:13:40]

고정길이 코드라고 생각하고 답변 드렸습니다.
가변길이 라면 CHARINDEX 구문이 좀더 복잡해 집니다.
CHARINDEX(CONCAT(',', code, ','), CONCAT(',', a.code_code, ','))


by 킬유머신 [2019.07.17 17:49:50]

아하, 방법은 역시 있었군요 마농님 감사합니다!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입