[초급질문]MSSQL에서 0 4 712

by GOGOGO [SQL Query] [2020.10.10 18:25:27]



안녕하세요? 이제 막 SQL에 입문한 초보자입니다. 어느정도 경력이 있으신분들에게는 쉬울수 있으나 아직 제게 너무 어려운 문제가 있는데요...

첨부사진을 보면 현재 제가 하고자 하는 것은 MSSQL데이터타입을 ORACLE형태로 바꿔서 출력해야 합니다. 현재 테이블/컬럼 명세서 작성을 다루고 있습니다.

1. 일단 bigint, int, decimal부분은 최대길이에 관계없이 number(19), number(10), number 이렇게 뽑으면 될까요? 특히 decimal같은 경우 15는 어떻게 해야할지 모르겠네요... 그냥 number로 하면 될 것 같은데...

2. 쿼리를 짜는데 

 CASE WHEN A.DATA_TYPE LIKE 'BIGINT%' THEN 'NUMBER(19)'
                WHEN A.DATA_TYPE LIKE 'DATETIME' THEN 'DATE'
                WHEN A.DATA_TYPE LIKE 'INT%' THEN 'NUMBER(10)'
                WHEN A.DATA_TYPE LIKE 'DECIMAL%' THEN 'NUMBER'
       ...
       ELSE
       END AS ORACLE_FORM
여기까지는 이렇게 하면 될 것 같은데,

nchar나 varchar부분은 뒤의 괄호 숫자는 놔두고 앞부분만 바꿔야 하는데, 이 부분을 어떻게 해야할지 모르겠습니다.

replace를 쓰자니 CASE WHEN에는 replace를 못쓰니 한번에 ORACLE_FORM 컬럼에는 안 들어가고...

MSSQL은 테이블/컬럼명세서에 데이터타입이랑 길이가 따로 나와서 중간에 DATA_TYPE+MAXLENGTH처럼 "A.DATA_TYPE + '(' + CAST(COL_LEN AS VARCHAR) + ')'" 이렇게 작성을 해서 출력이 된 겁니다. 이걸 다시 활용하자니 bigint(19), datetime(0), int(10), decimal(15)를 또 어떻게 해야할지 몰라서...

도움내지 힌트를 주시면 정말감사하겠습니다. ^^

                
 

by pajama [2020.10.10 19:49:10]

case로 분기하면 되지 않을까요?

with t as (
select 19 col_len, 'bigint' data_type
union all select null, 'datetime'
union all select 10, 'int'
union all select 15, 'decimal'
union all select 20, 'nvarchar'
union all select 1, 'varchar'
union all select 10, 'varchar'
union all select 100, 'varchar'
)
select *, 
       case when data_type in ('bigint', 'int')    then 'number' + '(' + cast(col_len as varchar) + ')' 
            when data_type = 'datetime'            then 'date'
            when data_type = 'decimal'             then 'number'
            when data_type = 'nvarchar'            then 'nchar' + '(' + cast(col_len as varchar) + ')'
            when data_type = 'varchar'             then 'varchar2' + '(' + cast(col_len as varchar) + ')'
       end oracle
from t

 


by GOGOGO [2020.10.10 20:16:48]

답변 정말 감사합니다.

제가 아직 부족해서 조금 더 살펴봐야하는데, 그전에 한번더 질문드리고 싶은 것은...

보기에는 그냥 제가 몇개 올리지 않았지만 실제로는 with절에 union을 쓰기에는 그 항목이 꽤 많은데, 그럴경우에는 어떻게 해야하죠?


by pajama [2020.10.10 21:37:22]

with 절의 테이블은 예를 들어주신 표의 내용을 나타낸것입니다.

저런 형태의 테이블이 있으시면 아래 쿼리만 사용하시면 되겠죠~


by GOGOGO [2020.10.11 16:51:30]

아, 그렇네요.
 

정말 감사합니다. 덕분에 잘 해결되었습니다. ^^

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