비교 연산

다음은 비교 연산자의 피연산자 타입에 따른 변환 규칙이다.

operand1 타입

operand2 타입

변환

비교

수치형 타입

수치형 타입

없음

NUMERIC

문자열 타입

operand2를 DOUBLE로 변환

NUMERIC

날짜/시간 타입

없음

N/A

문자열 타입

수치형 타입

operand1을 DOUBLE로 변환

NUMERIC

문자열 타입

없음

문자열

날짜/시간 타입

operand1을 날짜/시간 타입으로 변환

날짜/시간

날짜/시간 타입

수치형 타입

없음

N/A

문자열 타입

operand2를 날짜/시간 타입으로 변환

날짜/시간

날짜/시간 타입

우선순위가 높은 타입으로 변환

날짜/시간

비교 연산자 변환 규칙에는 다음과 같은 예외가 있다.

operand1 타입

operand2 타입

변환

비교

문자열 타입

수치형 타입

operand2를 문자열 타입으로 변환

문자열

operand1 타입

operand2 타입

변환

비교

문자열 타입

수치형 타입

operand2를 문자열 타입으로 변환

문자열

 

날짜/시간 타입

operand2를 문자열 타입으로 변환

문자열

operand2가 집합인 연산자(IS IN, IS NOT IN, = ALL, = ANY, < ALL, < ANY, <= ALL, <= ANY, >= ALL, >= ANY)에 대해서는 위의 예외가 적용되지 않는다.

수치형 타입과 문자열 타입 피연산자

문자열 타입 피연산자가 DOUBLE로 변환된다.

CREATE TABLE t(i INT, s STRING);

INSERT INTO t VALUES(1,'1'),(2,'2'),(3,'3'),(4,'4'), (12,'12');

 

SELECT i FROM t WHERE i < '11.3';

 

            i

=============

            1

            2

            3

            4

 

SELECT ('2' <= 11);

 

     ('2'<11)

=============

            1

문자열 타입과 날짜/시간 타입 피연산자

문자열 타입 피연산자가 날짜/시간 타입으로 변환된다.

SELECT ('2010-01-01' < date'2010-02-02');

 

   ('2010-01-01'<date '2010-02-02')

==================================

                                1

 

SELECT (date'2010-02-02' >= '2010-01-01');

 

  (date '2010-02-02'>='2010-01-01')

===================================

                                1

문자열 타입과 수치형 타입 호스트 변수 피연산자

수치형 타입 호스트 변수가 문자열 타입으로 변환된다.

PREPARE s FROM 'SELECT s FROM t WHERE s < ?';

EXECUTE s USING 11;

       s

===================

     '1'

문자열 타입 컬럼과 수치형 타입 값 피연산자

수치형 타입 값이 문자열 타입으로 변환된다.

SELECT s FROM t WHERE s > 11;

       s

==================

     '2'

     '3'

     '4'

     '12'

 

SELECT s FROM t WHERE s BETWEEN 11 AND 33;

        s

======================

      '2'

      '3'

      '12'

문자열 타입 컬럼과 날짜/시간 타입 값 피연산자

날짜/시간 타입 값이 문자열 타입으로 변환된다.

SELECT s FROM t;

 

           s

======================

    '01/01/1998'

    '01/01/1999'

    '01/01/2000'

 

SELECT s FROM t WHERE s <= date'02/02/1998';

            s

======================

    '01/01/1998'

    '01/01/1999'

    '01/01/2000'