반응형

SELECT시 특정 필드를 CONVERT할 경우가 종종있다.
그런데 데이터 이상으로 해당 레코드들만 제외하고 CONVERT를 해야 할 경우 WHERE 조건을 준다한들 예외 오류가 발생하게 된다.

예를들어
퇴사일이 없는 (NULL값)직원이 있고 있는 직원이 있다치자
일괄적으로 CONVERT를 실행할 경우 여지없이 해당 NULL값인 직원의 데이터 때문에 예외 오류가 발생한다.
그러하다면 WHERE조건을 주고 해당 레코드들을 제외시킨 후 CONVERT를 하면 되겠거니 싶지만
여지없이 예외오류를 내뱉는다.
서브쿼리로 해당 테이블을 1차 가공 후 CONVERT를 실행시켜도 똑같다.

괴이한건 이 상황에서 그냥 TOP 1000000 을 주고 실행하면 오류를 발생시키지 않는다.
그렇다고 매번 TOP으로 실행하자니 못마땅하다.

이때 사용할 함수가 try_cast, try_convert, try_parse 되시겠다.

조금 더 구체적인 예로 try_convert 함수를 설명해 보겠다.

학생테이블인 STUDENT라는 테이블의 USERID 필드가 VARCHAR(50) 형태로 존재하고
아래처럼 해당 필드는 학번값을 저장하고 있다 치자

USERID
9201013
9201014
crazymyid94
student1101
0088341
0101003


그런데 특이하게 몇몇 레코드만 영문자로 되어 있는 상태고 학번의 앞자리 2자리를 기준으로 입학년도를 추출해야 할 상황인 경우
그냥 CONVERT쿼리를 실행하든 앞서 설명한 상황처럼 SUBQUERY, NOT IN, 알파벳을 제외하는 방법(not like '%[a-zA-Z]%') 등등
뭔짓을 해도 예외오류를 발생시킬 것이다.

메시지 245, 수준 16, 상태 1, 줄 15
varchar 값 'cr'을(를) 데이터 형식 int(으)로 변환하지 못했습니다.

이럴 땐 TRY_CONVERT함수를 WHERE문으로 실행시켜주면 깔끔하게 해결된다.
SELECT USERID FROM STUDENT WHERE TRY_CONVERT(INT, LEFT(USERID, 2)) <= 99

반응형
Posted by Hippalus
,