Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 8.4.3 |  CUBRID 9.0.0 | 

변환 규칙

INSERT와 UPDATE

영향을 받는 칼럼의 타입으로 값의 타입이 변환된다.

CREATE TABLE t(i INT);

INSERT INTO t VALUES('123');

 

SELECT * FROM t;

 

            i

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

          123

함수

함수에 입력한 인자 값을 함수에서 지정한 타입으로 변환할 수 있으면 인자의 타입이 변환된다. 아래 함수에서 기대하는 입력 인자는 숫자이므로, 문자열을 숫자로 변환한다.

SELECT MOD('123','2');

 

           mod('123', '2')

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

     1.000000000000000e+00

함수는 인자로 여러 타입의 값을 입력받을 수 있는데, 함수에서 지정하지 않은 타입의 값이 전달되면 다음의 우선순위에 따라 타입이 변환된다.

  • 날짜/시간 타입(DATETIME > TIMESTAMP > DATE > TIME)
  • 근사치 수치형 타입(MONETARY > DOUBLE > FLOAT)
  • 정확한 수치형 타입(NUMERIC > BIGINT > INT > SHORT)
  • 문자열 타입(CHAR/NCHAR > VARCHAR/VARNCHAR)
비교 연산

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

operand1 타입

operand2 타입

변환

비교

수치형 타입

수치형 타입

없음

NUMERIC

문자열 타입

operand2를 DOUBLE로 변환

NUMERIC

날짜/시간 타입

없음

N/A

문자열 타입

수치형 타입

operand1을 DOUBLE로 변환

NUMERIC

문자열 타입

없음

문자열

날짜/시간 타입

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

날짜/시간

날짜/시간 타입

수치형 타입

없음

N/A

문자열 타입

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

날짜/시간

날짜/시간 타입

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

날짜/시간

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

  • COLUMN <operator> 값

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'

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

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

SELECT i FROM t WHERE i <= all {'11','12'};

 

            i

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

            1

            2

            3

            4

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

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

SELECT s FROM t2;

 

          s

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

      '01/01/2000'

      '01/01/1999'

      '01/01/1998'

 

SELECT s FROM t2 WHERE s <= ALL {date'02/02/1998',date'01/01/2000'};

 

          s

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

       '01/01/1998'

해당 타입으로 변환할 수 없으면 오류를 반환한다.

산술 연산
날짜/시간 타입 피연산자

날짜/시간 타입의 피연산자가 '-' 연산자에 주어지고 타입이 서로 다르면, 두 타입을 비교하여 우선순위가 높은 쪽의 타입으로 변환된다. 다음 예는 왼쪽 피연산자의 데이터 타입이 DATE에서 DATETIME으로 바뀌어 결과는 DATETIME의 '-' 연산 결과인 밀리초를 출력한다.

SELECT date'2002-01-01' - datetime'2001-02-02 12:00:00 am';

 

   date '2002-01-01'- datetime '2001-02-02 12:00:00 am'

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

                                          28771200000

수치형 타입 피연산자

수치형 타입의 피연산자가 주어지고 타입이 서로 다르면, 두 타입을 비교하여 우선순위가 높은 쪽의 타입으로 변환된다.

날짜/시간 타입과 수치형 타입 피연산자

날짜/시간 타입과 수치형 타입의 피연산자가 '+' 또는 '-' 연산자에 주어지면, 수치형 타입 피연산자는 BIGINT, INT, SHORT 중 하나로 변환된다.

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

날짜/시간 타입과 문자열 타입이 피연산자이면, '+'와 '-' 연산자만 허용한다. '+' 연산자가 사용되면 다음 규칙이 적용된다.

  • 문자열 타입은 인터벌(interval) 값을 지닌 BIGINT로 변환된다. 인터벌은 날짜/시간 타입 피연산자의 가장 작은 단위를 의미하며, 각 타입의 인터벌 값은 다음과 같다.
    • DATE : 일수(days)
    • TIME, TIMESTAMP : 초수(seconds)
    • DATETIME : 밀리초수(milliseconds)
  • 부동소수점수는 반올림된다.
  • 결과 타입은 날짜/시간 타입 피연산자의 타입이다.

SELECT date'2002-01-01' + '10';

 

  date '2002-01-01'+'10'

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

  01/11/2002

날짜/시간 타입과 문자열 타입이 피연산자이고, '-' 연산자가 사용되면 다음 규칙이 적용된다.

  • 날짜/시간 타입 피연산자가 DATE, DATETIME, TIMESTAMP이면 문자열은 DATETIME으로 변환되고, 날짜/시간 타입 피연산자가 TIME이면 문자열은 TIME으로 변환된다.
  • 결과 타입은 항상 BIGINT이다.

SELECT date'2002-01-01'-'2001-01-01';

 

  date '2002-01-01'-'2001-01-01'

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

                    31536000000

 

-- this causes an error

 

SELECT date'2002-01-01'-'10';

 

 In line 1, column 13,

 ERROR: Cannot coerce '10' to type datetime.    

 

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

수치형 타입과 문자열 타입이 피연산자이면 다음 규칙이 적용된다.

  • 문자열은 가능하면 DOUBLE로 변환된다.
  • 결과 타입은 DOUBLE 또는 MONETARY이며, 수치형 피연산자의 타입에 따라 결정된다.

SELECT 4 + '5.2';

 

                4+'5.2'

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

  9.199999999999999e+00

CUBRID 2008 R3.1 이하 버전과 달리, 날짜/시간 형태의 문자열, 즉  '2010-09-15'와 같은 문자열은 날짜/시간 타입으로 변환되지 않는다. 날짜/시간 타입을 갖는 리터럴(DATE'2010-09-15')은 덧셈, 뺄셈 연산에 사용할 수 있다.

SELECT '2002-01-01'+1;

   ERROR: Cannot coerce '2002-01-01' to type double.

SELECT DATE'2002-01-01'+1;

  date '2002-01-01'+1

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

  01/02/2002

문자열 타입 피연산자

두 문자열을 곱하거나 나누거나 빼면 숫자로 변환되며, 결과로 DOUBLE 타입의 값을 반환한다.

SELECT '3'*'2';

 

                     '3'*'2'

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

       6.000000000000000e+00

'+' 연산자의 동작은 cubrid.conf의 시스템 파라미터인 plus_as_concat을 어떻게 설정하느냐에 따라 결정된다. 자세한 내용은 구문/타입 관련 파라미터를 참고한다.

  • plus_as_concat 값이 yes(기본값)이면 두 개의 문자열을 연결한 값을 반환한다.
  • SELECT '1'+'1';
  •  
  •                '1'+'1'
  • ======================
  •                   '11'
  • plus_as_concat 값이 no 이고 두 개의 문자열이 숫자로 변환 가능하면, 두 숫자를 더하여 DOUBLE 타입의 값을 반환한다.
  • SELECT '1'+'1';
  •  
  •                    '1'+'1'
  • ==========================
  •      2.000000000000000e+00

해당 타입으로 변환할 수 없으면 오류를 반환한다.