두 쿼리의 차이를 잘 모르겠습니다. 0 4 855

by 빛나는관 [2015.07.10 16:34:45]


구루비질문1.PNG (34,250Bytes)
구루비질문2.PNG (35,012Bytes)

월별 급여를 받는 사원들을 표시하는 것인데요, 

싱글쿼테이션을 붙이면 일부분만 출력이 되고, 안 붙이면 정상적으로 모든 사원의 월급이 출력됩니다.

왜 저렇게 되는 건지 알려주시면 감사하겠습니다!

by 신이만든짝퉁 [2015.07.10 16:51:53]

hiredate는 date 타입으로, to_char(hiredate, 'MM') 으로 변경하면 01 ~ 12까지의 문자열로 변환됩니다.

문자 '1' 과 '01'은 엄연히 다른 문자로, 첫 번째 이미지에서 문자 1 ~ 9는 문자 01 ~ 09로 각각 비교되어 그림과 같이 결과가 나오는 것입니다.
올바른 비교 방법은 DECODE(TO_CHAR(HIREDATE, 'MM'), '01', SAL, 0) 가 되겠습니다.

두번째 이미지에서는 문자 01 ~ 12를 숫자 1 ~ 12와 비교하였으나 문자 01 ~ 12가 숫자 1 ~ 12으로 형변환이 되었습니다.(묵시적 형변환)
이에 숫자 1 ~ 12를 서로 비교하여 결과가 그림과 같이 나오는 것입니다.

 


by 빛나는관 [2015.07.10 16:56:20]

자세한 설명 감사합니다~!


by 마농 [2015.07.10 16:58:30]

TO_CHAR(hiredate, 'mm') 의 결과는 '01', '02' 형태의 문자열입니다.
'01' 은 '1' 과 다르니 결과가 안나오는 거구요.
'01' 을 1 과 비교하면?
이 때는 비교를 위해 두 비교값의 형식을 맞추게 됩니다.
숫자 문자 비교시엔 숫자 우선으로 형변환을 하게 됩니다.
즉 문자열 '01' 을 숫자로 바꾸어 비교하게 되며 1=1 이 되어 값이 나오게 되는 것이죠.
비교식을 사용할 때는 반드시 자료형과 형태를 모두 일치시켜주는 것이 중요합니다.
즉, 두개 다 잘못 사용한거죠.
'01' = '1'  (틀린사용)
'01' = 1    (값은 나왔지만 내부적 변환함수 사용에 따른 비효율과 잠재적 오류가능성)
'01' = '01' (올바른 사용법)


by 빛나는관 [2015.07.10 17:24:34]

마농님, 항상 자세한 답변 정말 감사합니다!!^^

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