티스토리 뷰

DB

[SQL] 문자형 비교연산자

jckim 2020. 7. 15. 23:51

원인

작업하다가 아래와 같은 쿼리에서 의문점이 생김.

 

좌측 날짜와 시간을 나타내는 문자형 데이터(실제로는 테이블 데이터 비교하기 쉽게 직접 값 넣음)

우측 현재 시스템 시간을 YYYYMMDD 형식으로 변환한 문자형을 비교하는데

보자마다 생긴 의문점은 자릿수날짜 형식이 다른데 어떻게 비교가 되는가 였고

더욱 의문점은 원하는 결과가 나왔다는 것이다.

 

문제의 쿼리

1
2
3
4
5
6
7
SELECT
    *
FROM
    TABLE01
WHERE
    '20200101000000' < TO_CHAR(SYSDATE, 'YYYYMMDD');
cs

우선 해당 비교 값이 문자형이라는 점을 기반으로 좀 더 확인해 보았다.


원인 파악

  • NUMBER 데이터 타입과 그 외 데이터 타입 비교 시 그 외 데이터 타입은 NUMBER 타입으로 변환 후 비교.
  • 오라클에서 문자형을 비교 연산자로 구분할 때는 왼쪽부터 한 글자씩 아스키코드로 변환 후 비교함. 
  • 왼쪽부터 비교 시 자릿수가 맞지 않는 경우 뒷자리는 상관없음.
  • CHAR형과 CHAR형 비교 시 자릿수가 더 큰 데이터에 맞춰지며 부족한 자릿수는 공백으로 채워짐.
  • CHAR형과 VARCHAR형 비교 시에는 아스키코드로 변환 후 문자형 비교.

문제의 쿼리에 해당하는 원인 파악 내용은 굵게 표시한 기본 동작과 관련 있는 것으로 보임.

또한 아스키코드에서 숫자는 숫자 순서대로 정의되어있음.

 


 

문제의 쿼리에 적용

해당 쿼리를 실행한 시간이 2020년 7월 15일이라고 가정하였을 때

TO_CHAR(SYSDATE, 'YYYYMMDD')는 문자형 "20200715"이며 " 20200101000000"와 비교됨.

굵게 표시한 부분이 현재 비교되고 있는 자리이다.

비교 자릿수 6에서 문자형의 대소가 구분이 되었기 때문에 뒷자리는 더 이상 비교의 의미가 없음.

비교 자릿수 1 비교 자릿수 2 비교 자릿수 3 비교 자릿수 4 비교 자릿수 5 비교 자릿수 6
20200101000000 20200101000000 20200101000000 20200101000000 20200101000000 20200101000000
20200715 20200715 20200715 20200715 20200715 20200715

이러한 과정 때문에 문제의 쿼리가 정상적으로 결과가 나오는 걸 이해할 수 있었음.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함