SQL Elements

Syntax Elements

Identifiers

Identifier는 ordinary identifier와 delimited identifier로 나뉜다.
Ordinary identifier는 문자 또는 문자와 숫자로 구성된 identifier로써 내부적으로 모든 문자를 대문자로 치환하여 사용한다. 따라서 대소문자를 구분하지 않는다.

다음은 ordinary identifier의 예이다.

GOLDILOCKS
GoldiLocks

Delimited identifier는 double quote (")를 시작과 끝에 기술한 문자 또는 문자와 숫자로 구성된 identifier로써 내부적으로 해당 문자를 모두 기술한 그대로 사용한다. 따라서 delimited identifier를 사용할 경우 대소문자를 구분한다.

다음은 delimited identifier의 예이다.

"GOLDILOCKS"
"GoldiLocks"

Literals

Literals는 null이 아닌 값을 기술한 것이다.

Text Literals

Text literals는 string이나 binary string을 기술한 것이다.

String의 시작과 끝에 single quote (')를 작성하여 string에 대한 text literals를 사용할 수 있다. Double quote (") 뿐만 아니라 single quote (')를 제외한 모든 문자열이 single quote (') 안에 작성하는 string이 될 수 있다. 만약 string에 single quote (')를 사용하려면 single quote (')를 공백없이 연속으로 두 번 작성해야 한다. String에는 최대 4,000 문자까지 작성할 수 있다.

다음은 string에 대한 text literals를 작성하는 예이다.

'GOLDILOCKS'
'Sunje''s DBMS'

Binary string에 대한 text literals는 x' 또는 X'로 시작하고 '로 끝나는 16진수의 string을 기술한다. 16진수의 string은 각 자리에 0 ~ 9, A (a) ~ F (f)에 해당하는 문자만 기술할 수 있으며, 두 자리의 문자가 하나의 byte를 의미하므로 항상 짝수 자리를 작성해야 한다. Binary string은 최대 4,000 문자까지 작성할 수 있다.

다음은 binary string에 대한 text literals를 작성하는 예이다.

x'001f'
X'FF0A'
x'aF37BBc013'

Numeric Literals

Numeric literals는 숫자타입의 literals를 작성하는 형식으로써 정수나 소수점 이하의 자리를 갖는 숫자를 작성할 수 있다. Numeric literals에 대한 문법은 다음과 같다.

[ + | - ] <digits> [ . <digits> ] [ E | e [ + | - ] <digits> ] [ f | F | d | D ]

다음은 numeric literals를 작성하는 예이다.

20
+123.45
0.03
+1.23E-02
-1.5

10f
+123.45F
1.2E-3F
-22d
123.45D
-1.23E+05D

Datetime Literals

Datetime literals는 날짜/ 시간 타입에 대한 literals를 작성하는 형식이다. Datetime value는 string literal을 사용하여 지정하거나 TO_* 함수(TO_DATE 등)를 이용해 character 또는 numeric value를 변환하여 지정할 수도 있다.
날짜/시간 타입에는 DATE, TIME, TIME WITH TIME ZONE, TIMESTAMP, TIMESTAMP WITH TIME ZONE 이 있다.

Date Literals

Date literals는 DATE'string literal' 또는 TO_DATE(string_literal [, format])의 형태로 작성할 수 있다.
자세한 내용은 TO_DATE, Datetime Format 문자열, NLS_DATE_FORMAT을 참조한다.

다음은 date literals를 작성하는 예이다.

DATE'2002-07-15'
TO_DATE( '2002-07-15' )
TO_DATE( '15-JUL-02', 'DD-MON-RR' )
TO_DATE( '2002-07-15 00:00:00', 'YYYY-MM-DD HH24:MI:SS' )
TO_DATE( '2002-07-15 13:25:30', 'YYYY-MM-DD HH24:MI:SS' )
gSQL> SELECT TO_DATE( '2000-07', 'YYYY-MM' ) FROM DUAL;
  TO_DATE( '2000-07', 'YYYY-MM' )
  -------------------------------
  2000-07-01
gSQL> SELECT 
        TO_CHAR( DATE'2002-07-15', 'YYYY-MM-DD HH24:MI:SS' ) AS RESULT
        FROM DUAL;
  RESULT             
  -------------------
  2002-07-15 00:00:00
gSQL> SELECT 
        TO_CHAR( SYSDATE, 
                 'YYYY-MM-DD HH24:MI:SS' ) AS RESULT_SYSDATE,
        TO_CHAR( TRUNC( SYSDATE ),
                 'YYYY-MM-DD HH24:MI:SS' ) AS RESULT_TRUNC_SYSDATE 
        FROM DUAL;
  RESULT_SYSDATE      RESULT_TRUNC_SYSDATE
  ------------------- --------------------
  2014-08-19 10:06:49 2014-08-19 00:00:00
gSQL> SELECT 
        TO_DATE( '2002-08-12' ) = 
        TRUNC( TO_DATE( '2002-08-12 23:59:59', 'YYYY-MM-DD HH24:MI:SS' ) )
        AS RESULT FROM DUAL;
  RESULT
  ------
  TRUE

Time Literals

Time literals는 TIME'string literal' 또는 TO_TIME(string_literal [, format])의 형태로 작성할 수 있다.
Time 타입은 시분초, fractional seconds (소수점이하초)를 포함한다.
Fractional seconds는 최대 여섯 자리 숫자의 형식을 지정하여 작성할 수 있다.
자세한 내용은 TO_TIME, Datetime Format 문자열, NLS_TIME_FORMAT을 참조한다.

다음은 time literals를 작성하는 예이다.

TIME'15:30:59.999999'
TO_TIME( '15:30:59.999999' )
TO_TIME( '09.45.03.546873 AM', 'HH12.MI.SS.FF6 AM' )
TO_TIME( '09:45:03', 'HH12:MI:SS' )

Time with time zone Literals

Time with time zone literals는 TIME'string literal', TIME WITH TIME ZONE'string literal' 또는 TO_TIME_WITH_TIME_ZONE(string_literal [, format] ) , TO_TIME_TZ(string_literal [, format] )의 형태로 작성할 수 있다.
Time with time zone 타입은 시분초, fractional seconds (소수점이하초), time zone offset (time zone hour, time zone minute)를 포함한다.
Fractional seconds는 최대 여섯 자리 숫자의 형식을 지정하여 작성할 수 있다.
자세한 내용은 TO_TIME_WITH_TIME_ZONE, Datetime Format 문자열, NLS_TIME_WITH_TIME_ZONE_FORMAT을 참조한다.

다음은 time with time zone literals를 작성하는 예이다.

TIME'15:30:59.999999 +09:00'
TIME WITH TIME ZONE'15:30:59.999999 +09:00'
TO_TIME_WITH_TIME_ZONE( '15:30:59.999999 +09:00' )
TO_TIME_TZ( '15:30:59.999999 +09:00' )
TO_TIME_WITH_TIME_ZONE( '09.45.03.546873 +09:00 AM', 
                        'HH12.MI.SS.FF6 TZH:TZM AM' )

Timestamp Literals

Timestamp literals는 TIMESTAMP'string literal' 또는 TO_TIMESTAMP(string_literal [, format] )의 형태로 작성할 수 있다.
Timestamp 타입은 년월일, 시분초, fractional seconds (소수점이하초)를 포함한다.
Fractional seconds는 최대 여섯 자리 숫자의 형식을 지정하여 작성할 수 있다.
자세한 내용은 TO_TIMESTAMP, Datetime Format 문자열, NLS_TIMESTAMP_FORMAT을 참조한다.
다음은 timestamp literals를 작성하는 예이다.
TIMESTAMP'2002-07-15 15:39:59.999999'
TO_TIMESTAMP( '2002-07-15 15:39:59.999999' )
TO_TIMESTAMP( '15-JUL-02 11.06.30.123456 AM', 
              'DD-MON-RR HH12.MI.SS.FF6 AM' )

Timestamp with time zone Literals

Timestamp with time zone literals는 TIMESTAMP'string literal',  TIMESTAMP WITH TIME ZONE'string literal' 또는 TO_TIMESTAMP_WITH_TIME_ZONE(string_literal [, formt] ), TO_TIMESTAMP_TZ(string_literal [, format])의 형태로 작성할 수 있다.
Timestamp with time zone 타입은 년월일, 시분초, fractional seconds (소수점이하초), time zone offset (timezone hour, timezone minute)을 포함한다.
Fractional seconds는 최대 여섯 자리 숫자의 형식을 지정하여 작성할 수 있다.
자세한 내용은 TO_TIMESTAMP_WITH_TIME_ZONE, Datetime Format 문자열,  NLS_TIMESTAMP_WITH_TIME_ZONE_FORMAT을 참조한다.

다음은 timestamp with time zone literals를 작성하는 예이다.

TIMESTAMP'2002-07-15 15:39:59.999999 +09:00'
TIMESTAMP WITH TIME ZONE'2002-07-15 15:39:59.999999 +09:00'
TO_TIMESTAMP_WITH_TIME_ZONE( '2002-07-15 15:39:59.999999 +09:00' )
TO_TIMESTAMP_TZ( '2002-07-15 15:39:59.999999 +09:00' )
TO_TIMESTAMP_WITH_TIME_ZONE( '15-JUL-02 11.06.30.123456 +09:00 AM',
                             'DD-MON-RR HH12.MI.SS.FF6 TZH:TZM AM' )
TO_TIMESTAMP_TZ( '15-JUL-02 11.06.30.123456 +09:00 AM',
                 'DD-MON-RR HH12.MI.SS.FF6 TZH:TZM AM' )

Interval Literals

Interval literals는 시간의 간격을 지정한다.

Interval은 크게 두 가지로 분류되며 다음과 같이 표현한다.

Interval 타입 목록은 다음과 같다.

Leading precision
• 해당 field의 자리수로써 2 ~ 6까지 지정할 수 있으며, 지정하지 않을 경우의 기본값은 2이다.
• Leading field 값이 leading precision 값을 초과하면 에러를 반환한다.
Fractional seconds precision
• Fractional seconds의 자리수로써 0 ~ 6까지 지정할 수 있으며, 지정하지 않을 경우의 기본값은 6이다.
• Fractional second field 값이 fractional seconds precision 값을 초과하면 반올림된다.
자세한 내용은 INTERVAL, INTERVAL * TO * 에서 두 번째 이후 field의 precision과 값의 범위, NUMTOYMINTERVAL , NUMTODSINTERVAL을 참조한다.

Interval literals의 사용 예

다음은 interval literals를 사용하는 예들이다.

Interval YEAR

다음은 interval YEAR literals를 사용하는 예이다.

설명

Display string

INTERVAL'1'YEAR

INTERVAL'01-00'YEAR

1 year

+01-00

INTERVAL'100'YEAR

Leading precision 2를 초과하여 에러가 반환된다.

-

INTERVAL'100'YEAR(3)

100 year

+100-00

INTERVAL'+999999'YEAR(6)

999999 year

+999999-00

INTERVAL'-999999'YEAR(6)

-(999999 year)

-999999-00

Interval MONTH

다음은 interval MONTH literals를 사용하는 예이다.

설명

Display string

INTERVAL'1'MONTH

INTERVAL'00-01'MONTH

1 month

+00-01

INTERVAL'100'MONTH

Leading precision 2를 초과하여 에러가 반환된다.

-

INTERVAL'100'MONTH(3)

8 year 4 month

+008-04

INTERVAL'+999999'MONTH(6)

83333 year 3 month

+083333-03

INTERVAL'-999999'MONTH(6)

-(83333 year 3 month)

-083333-03

Interval YEAR TO MONTH

다음은 interval YEAR TO MONTH literals를 사용하는 예이다.

설명

Display string

INTERVAL'1-06'YEAR TO MONTH

1 year 6 month

+01-06

INTERVAL'1-12'YEAR TO MONTH

Month value가 11을 초과하여 에러가 반환된다.

-

INTERVAL'100-11'YEAR TO MONTH

Leading precision 2를 초과하여 에러가 반환된다.

-

INTERVAL'100-11'YEAR(3) TO MONTH

100 year 11 month

+100-11

INTERVAL'+999999-11'YEAR(6) TO MONTH

999999 year 11 month

+999999-11

INTERVAL'-999999-11'YEAR(6) TO MONTH

-(999999 year 11 month)

-999999-11

Interval DAY

다음은 interval DAY literals를 사용하는 예이다.

설명

Display string

INTERVAL'1'DAY

INTERVAL'01 00:00:00'DAY

1 day

+01 00:00:00

INTERVAL'100'DAY

Leading precision 2를 초과하여 에러가 반환된다.

-

INTERVAL'100'DAY(3)

100 day

+100 00:00:00

INTERVAL'+999999'DAY(6)

999999 day

+999999 00:00:00

INTERVAL'-999999'DAY(6)

-(999999 day)

-999999 00:00:00

Interval HOUR

다음은 interval HOUR literals를 사용하는 예이다.

설명

Display string

INTERVAL'1'HOUR

INTERVAL'00 01:00:00'HOUR

1 hour

+00 01:00:00

INTERVAL'1000'HOUR(3)

Leading precision 3을 초과하여 에러가 반환된다.

-

INTERVAL'1000'HOUR(4)

41 day 16 hour

+0041 16:00:00

INTERVAL'+999999'HOUR(6)

41666 day 15 hour

+041666 15:00:00

INTERVAL'-999999'HOUR(6)

-(41666 day 15 hour)

-041666 15:00:00

Interval MINUTE

다음은 interval MINUTE literals를 사용하는 예이다.

설명

Display string

INTERVAL'1'MINUTE

INTERVAL'00 00:01:00'MINUTE

1 minute

+00 00:01:00

INTERVAL'12345'MINUTE(4)

Leading precision 4를 초과하여 에러가 반환된다.

-

INTERVAL'12345'MINUTE(5)

8 day 13 hour 45 minute

+00008 13:45:00

INTERVAL'+999999'MINUTE(6)

694 day 10 hour 39 minute

+000694 10:39:00

INTERVAL'-999999'MINUTE(6)

-(694 day 10 hour 39 minute)

-000694 10:39:00

Interval SECOND

다음은 interval SECOND literals를 사용하는 예이다.

설명

Display string

INTERVAL'1'SECOND

INTERVAL'00 00:00:01.000000'SECOND

1 second

+00 00:00:01.000000

INTERVAL'100'SECOND

Leading precision 2를 초과하여 에러가 반환된다.

-

INTERVAL'99.9999999'SECOND

INTERVAL'99.9999999'SECOND(2,6)

Fractional seconds가 반올림되어 100 second가 되므로 leading precision 2를 초과하여 에러가 반환된다.

-

INTERVAL'99.9999999'SECOND(3)

1 minute 40 second

+000 00:01:40.000000

INTERVAL'29.506167'SECOND(2, 2)

29.51 second

+00 00:00:29.51

INTERVAL'999999.999999'SECOND(6,6)

11day 13 hour 46 minute 39.999999 second

+000011 13:46:39.999999

INTERVAL'-999999.999999'SECOND(6,6)

-( 11day 13 hour 46 minute 39.999999 second)

-000011 13:46:39.999999

Interval DAY TO HOUR

다음은 interval DAY TO HOUR literals를 사용하는 예이다.

설명

Display string

INTERVAL'1 23'DAY TO HOUR

INTERVAL'01 23:00:00'DAY TO HOUR

1 day 23 hour

+01 23:00:00

INTERVAL'1 24'DAY TO HOUR

Hour value가 23을 초과한 invalid 값으로써 에러를 반환한다.

-

INTERVAL'100 23'DAY TO HOUR

Leading precision 2를 초과하여 에러를 반환한다.

-

INTERVAL'100 23'DAY(3) TO HOUR

100 day 23 hour

+100 23:00:00

INTERVAL'+999999 23'DAY(6) TO HOUR

999999 day 23 hour

+999999 23:00:00

INTERVAL'-999999 23'DAY(6) TO HOUR

-(999999 day 23 hour)

-999999 23:00:00

INTERVAL'-999999 +23'DAY(6) TO HOUR

부호지정 오류로 인한 에러이다.

-

Interval DAY TO MINUTE

다음은 interval DAY TO MINUTE literals를 사용하는 예이다.

설명

Display string

INTERVAL'1 23:59'DAY TO MINUTE

INTERVAL'01 23:59:00'DAY TO MINUTE

1 day 23 hour 59 second

+01 23:59:00

INTERVAL'1 24:59'DAY TO MINUTE

Hour value가 23을 초과한 invalid 값으로써 에러가 반환된다.

-

INTERVAL'1 23:60'DAY TO MINUTE

Minute value가 59를 초과한 invalid 값으로써 에러가 반환된다.

-

INTERVAL'100 23:59'DAY TO MINUTE

Leading precision 2를 초과하여 에러가 반환된다.

-

INTERVAL'100 23:59'DAY(3) TO MINUTE

100 day 23 hour 59 minute

+100 23:59:00

INTERVAL'+999999 23:59'DAY(6) TO MINUTE

999999 day 23 hour 59 minute

+999999 23:59:00

INTERVAL'-999999 23:59'DAY(6) TO MINUTE

-(999999 day 23 hour 59 minute)

-999999 23:59:00

Interval DAY TO SECOND

다음은 interval DAY TO SECOND literals를 사용하는 예이다.

설명

Display string

INTERVAL '1 23:59:59.999999'DAY TO SECOND

1 day 23 hour 59 minute 59.999999 second

+01 23:59:59.999999

INTERVAL '1 24:59:59.999999'DAY TO SECOND

Hour value가 23을 초과하여 에러가 반환된다.

-

INTERVAL '1 23:60:59.999999'DAY TO SECOND

Minute value가 59를 초과하여 에러가 반환된다.

-

INTERVAL '1 23:59:60.999999'DAY TO SECOND

Second value가 60을 초과하여 에러가 반환된다.

-

INTERVAL '99 23:59:59.9999999'DAY TO SECOND

Fractional seconds가 반올림되어 100 day가 되므로 leading precision 2를 초과하여 에러가 반환된다.

-

INTERVAL '99 23:59:59.9999999'DAY(3) TO SECOND

100 day

+100 00:00:00.000000

INTERVAL '1 11:22:33.567890'DAY(2) TO SECOND(2)

1 day 11 hour 22 minute 33.57 second

+01 11:22:33.57

INTERVAL '+999999 23:59:59.999999'DAY(6) TO SECOND(6)

999999 day 23 hour 59 minute 59.999999 hour

+999999 23:59:59.999999

INTERVAL '-999999 23:59:59.999999'DAY(6) TO SECOND(6)

-(999999 day 23 hour 59 minute 59.999999 hour)

-999999 23:59:59.999999

Interval HOUR TO MINUTE

다음은 interval HOUR TO MINUTE literals를 사용하는 예이다.

설명

Display string

INTERVAL'23:59'HOUR TO MINUTE

INTERVAL'00 23:59:00'HOUR TO MINUTE

23 hour 59 minute

+00 23:59:00

INTERVAL'23:60'HOUR TO MINUTE

Minute value가 59를 초과하여 에러가 반환된다.

-

INTERVAL'100:59'HOUR TO MINUTE

Leading precision 2를 초과하여 에러가 반환된다.

-

INTERVAL'100:59'HOUR(3) TO MINUTE

4 day 4 hour 59 minute

+004 04:59:00

INTERVAL'+999999:59'HOUR(6) TO MINUTE

41666 day 15 hour 59 minute

+041666 15:59:00

INTERVAL'-999999:59'HOUR(6) TO MINUTE

-(41666 day 15 hour 59 minute)

-041666 15:59:00

Interval HOUR TO SECOND

다음은 interval HOUR TO SECOND literals를 사용하는 예이다.

설명

Display string

INTERVAL '23:59:59.999999'HOUR TO SECOND

INTERVAL '00 23:59:59.999999'HOUR TO SECOND

23 hour 59 minute 59.999999 second

+00 23:59:59.999999

INTERVAL '23:60:59.999999'HOUR TO SECOND

Minute value가 59를 초과하여 에러가 반환된다.

-

INTERVAL '23:59:60.999999'HOUR TO SECOND

Second value가 59를 초과하여 에러가 반환된다.

-

INTERVAL '99:59:59.9999999'HOUR TO SECOND

Fractional seconds가 반올림되어 100 hour가 되므로 leading precision 2를 초과하여 에러가 반환된다.

-

INTERVAL '99:59:59.9999999'HOUR(3) TO SECOND

4 day 4 hour

+004 04:00:00.000000

INTERVAL '11:22:29.569'HOUR(3) TO SECOND(1)

11 hour 22 minute 29.6 second

+000 11:22:29.6

INTERVAL '+999999:59:59.999999'HOUR(6) TO SECOND(6)

41666 day 15 hour 59 minute 59.999999 second

+041666 15:59:59.999999

INTERVAL '-999999:59:59.999999'HOUR(6) TO SECOND(6)

-(41666 day 15 hour 59 minute 59.999999 second)

-041666 15:59:59.999999

Interval MINUTE TO SECOND

다음은 interval MINUTE TO SECOND literals를 사용하는 예이다.

설명

Display string

INTERVAL '15:23.123456'MINUTE TO SECOND

INTERVAL '00 00:15:23.123456'MINUTE TO SECOND

15 minute 23.123456 second

+00 00:15:23.123456

INTERVAL '15:60.123456'MINUTE TO SECOND

Second value가 59를 초과하여 에러가 반환된다.

-

INTERVAL '99:59.999999'MINUTE TO SECOND(2)

Fractional seconds가 반올림되어 100 minute가 되므로 leading precision 2를 초과하여 에러가 반환된다.

-

INTERVAL '99:59.999999'MINUTE(3) TO SECOND(2)

1 hour 40 minute

+000 01:40:00.00

INTERVAL '+999999:59.999999'MINUTE(6) TO SECOND(6)

694 day 10 hour 39 minute 59.999999 second

+000694 10:39:59.999999

INTERVAL '-999999:59.999999'MINUTE(6) TO SECOND(6)

-(694 day 10 hour 39 minute 59.999999 second)

-000694 10:39:59.999999

Null Value

Null value는 알 수 없는 값 또는 정의되지 않은 값이다. 모든 data type 값이 null value가 될 수 있다. 
Boolean type의 unknown 값은 null value로 대체되어 표현된다.
Null value는 keyword로 정의되어 있으며 대소문자 구분없이 사용한다.

다음은 null value를 기술하는 예이다.

NULL
Null

Comments

Single Line Comments

Single line comments는 -- 또는 //로 시작하는 comment 이다. Single line comments는 해당 comment 기호 뒤부터 해당 라인의 끝까지를 comment로 처리한다.

다음은 single line comments를 사용하는 예이다.

gSQL> SELECT I1, -- I2, I3,
2 I4, I5
3 FROM T1;

I1        I4        I5       
--------- --------- ---------
column i1 column i4 column i5

1 row selected.


gSQL> SELECT I1, // I2, I3,
2 I4, I5
3 FROM T1;

I1        I4        I5       
--------- --------- ---------
column i1 column i4 column i5

1 row selected.

Multiple Line Comments

Multiple line comments는 /*로 시작해서 */로 끝나는 comment 이다. Multiple line comments는 /*부터 */까지를 comment로 설정하며 여러 라인에 걸쳐 comment를 기술할 수 있다.

다음은 multiple line comments를 사용하는 예이다.

gSQL> SELECT I1, I2, I3, I4, I5
2 /* TABLE T1에 대하여
3    모든 COLUMN들을 출력한다. */
4 FROM T1;

I1        I2        I3        I4        I5       
--------- --------- --------- --------- ---------
column i1 column i2 column i3 column i4 column i5

1 row selected.

Hint Comments

Hint comments는 /*+로 시작하고, */로 끝나는 comment 이다. Hint comments는 multiple line comments와 비슷하지만 시작 기호에 +가 더 있다는 점이 다르다. Hint comments에서 시작기호의 *와 + 사이에 공백이 존재하면 multiple line comments로 처리되는 것에 주의한다.

Hint comments는 다른 comment들과 달리 사용 가능한 위치가 SELECT 키워드의 바로 다음으로 지정되어 있다. Hint comments에는 사용자가 GOLDILOCKS의 optimizer에게 처리 방법 등을 지정하는 내용이 기술되어 있는데 자세한 내용은 SQL Hint를 참조한다.

다음은 hint comments를 사용하는 예이다.

gSQL> SELECT /*+ FULL(T1) */ * FROM T1;

I1        I2        I3        I4        I5       
--------- --------- --------- --------- ---------
column i1 column i2 column i3 column i4 column i5

1 row selected.

SQL Reserved Words and Keywords

SQL Reserved Words

GOLDILOCKS에는 SQL reserved words로 지정된 reserved word가 있으며, 해당 SQL reserved words 들은 해당 사용 위치가 아닌 곳에서 사용할 수 없다.

SQL reserved words 를 double quote (") 를 이용하여 identifier 로 사용할 수 있으나, 이 경우 가독성이 떨어지므로 다음과 같이 사용하는 것은 권장하지 않는다.

gSQL> CREATE TABLE "SELECT" ( "FROM" INTEGER );

Table created.

gSQL> INSERT INTO "SELECT" ( "FROM" ) VALUES ( 1 );

1 row created.

gSQL> SELECT "FROM" FROM "SELECT";

FROM
----
   1

1 row selected.

다음은 GOLDILOCKS SQL reserved words인데 * 표시한 것은 SQL standard에서 명시한 reserved words이다. 해당 리스트는 V$RESERVED_WORDS view를 통해 검색할 수 있다.

ABSOLUTE
ACCESS
ADMINISTRATION
ALL *
ALLOCATE *
ALTER *
ANALYZE       
AND *
ANTI          
ANY *
ARE *
AS *
ASYMMETRIC *
AT *
AUDIT         
AUTHORIZATION *
BEGIN *
BETWEEN *
BOTH *
BY *
CALL *
CASE *
CHECK *
CLOSE *
CLUSTER            
CLUSTER_GROUP_ID   
CLUSTER_GROUP_NAME 
CLUSTER_MEMBER_ID  
CLUSTER_MEMBER_NAME
CLUSTER_SHARD_ID   
COLUMN *
COMMENT
COMMIT *
CONNECT *
CONNECT_BY_ISCYCLE 
CONNECT_BY_ISLEAF  
CONNECT_BY_ROOT    
CONSTRAINT *
CREATE *
CROSS *
CURRENT *
CURRENT_CATALOG *
CURRENT_DATE *
CURRENT_DEFAULT_TRANSFORM_GROUP *
CURRENT_PATH *
CURRENT_ROLE *
CURRENT_ROW *
CURRENT_SCHEMA *
CURRENT_TIME *
CURRENT_TIMESTAMP *
CURRENT_TRANSFORM_GROUP_FOR_TYPE *
CURRENT_USER *
DATABASE
DEALLOCATE *
DECLARE *
DEFAULT *
DELETE *
DEREF *
DESCRIBE *
DISCONNECT *
DISTINCT *
DROP *
ELSE *
EMPTY       
END *
ESCAPE *
EXCEPT *
EXEC *
EXECUTE *
EXISTS *
FALSE *
FETCH *
FILTER *
FIRST
FOR *
FOREIGN *
FREE *
FROM *
FULL *
FUNCTION *
GET *
GLOBAL *
GRANT *
GROUP *
HAVING *
HOLD *
IDENTIFIED
IF
IMMEDIATE
IN *
INDEX       
INDICATOR *
INNER *
INOUT *
INSERT *
INTERSECT *
INTO *
IS *
JOIN *
LAST
LATERAL       
LEADING *
LEFT *
LEVEL         
LIKE *
LIMIT
LOCAL *
LOCALTIME *
LOCALTIMESTAMP *
LOCAL_OFFLINE 
LOCK          
MATCH *
MEMBER *
MERGE *
MINUS
NATURAL *
NEW *
NEXT
NOAUDIT       
NONE          
NOT *
NULL *
OF *
OFFSET *
OLD *
ON *
OPEN *
OR *
ORDER *
OUT *
OVER            
PACKAGE         
PHYSICAL_PAGE_ID
PREPARE *
PRIMARY *
PRIOR
PROCEDURE *
PROFILE
REF *
REFERENCES *
RELATIVE
RELEASE *
RENAME
RETURN *
RETURNING
RETURNS *
REVOKE *
RIGHT *
ROLLBACK *
ROW *
ROWID
ROWNUM         
ROWS *
ROW_NUMBER *
SAVEPOINT *
SELECT *
SEMI           
SESSION_USER *
SET *
SHARDING_HANDLE
SOME *
SQL *
SQLEXCEPTION *
SQLSTATE *
SQLWARNING *
START *
SYMMETRIC *
SYNONYM
SYSDATE
SYSTEM *
SYSTEM_USER *
SYSTIME
SYSTIMESTAMP
SYS_CONNECT_BY_PATH
TABLE *
THEN *
TO *
TRAILING *
TRIGGER *
TRUE *
TRUNCATE *
UNION *
UNIQUE *
UNKNOWN *
UPDATE *
USAGE       
USER *
USING *
VALUES *
VIEW
WHEN *
WHENEVER *
WHERE *
WINDOW *
WITH *
WITHOUT *

SQL Keywords

GOLDILOCKS SQL keywords는 reserved word가 아니다. 그러나 GOLDILOCKS 내부적으로 사용하는 keyword이므로 GOLDILOCKS SQL keywords를 사용할 경우 결과의 가독성이 떨어질 수 있어 사용을 권장하지 않는다.

GOLDILOCKS SQL keywords 목록은 V$KEYWORDS view를 통해 검색할 수 있다.

호환성

Syntax element에 대한 SQL 표준 호환성은 다음과 같다.

SQL 표준 호환성

Feature ID

설명

지원 여부

E021-03

Character literals

O

E131

Null value support (nulls in lieu of values)

O

E161

SQL comments using leading double minus

O

F051-01

DATE data type (including support of DATE literal)

O

F051-02

TIME data type (including support of TIME literal) with fractional seconds precision of at least 0

O

F051-03

TIMESTAMP data type (including support of TIMESTAMP literal) with fractional seconds precision of at least 0 and 6

O

F271

Compound character literals

X

F383

Set column not null clause

O

F391

Long identifiers

X

F392

Unicode escapes in identifiers

X

F393

Unicode escapes in literals

X

T023

Compound binary literals

X

T024

Spaces in binary literals

X

T101

Enhanced nullability determination

X

T351

Bracketed comments

X

T591

UNIQUE constraints of possibly null columns

O

X041

Basic table mapping: null absent

X

X042

Basic table mapping: null as nil

X

X051

Advanced table mapping: null absent

X

X052

Advanced table mapping: null as nil

X

X170

XML null handling options

X

X400

Name and identifier mapping

X

Data Type

숫자 타입

숫자 타입은 크게 저장 방식과 소수부 표현 방식에 따라 구분할 수 있다.

십진 숫자 타입

유효 숫자의 정밀도를 나타내는 precision과 소수점의 범위를 나타내는 scale이 십진수 (decimal)를 기반으로 한다.

십진 고정 소수점 타입

십진 고정 소수점 타입은 SQL에서 정의한 타입이다.

십진 고정 소수점 타입

Type

Decimal precision

Decimal scale


NUMBER( p )

p

0

NUMBER

NUMBER( p, s )

p

s

NUMBER

NUMERIC( p )

p

0

NUMERIC

NUMERIC( p, s )

p

s

NUMERIC

DECIMAL( p )

p

0

NUMERIC 타입 alias

DECIMAL( p, s )

p

s

NUMERIC 타입 alias

DEC( p )

p

0

NUMERIC 타입 alias

DEC( p, s )

p

s

NUMERIC 타입 alias

SMALLINT

5

0

NUMBER 타입 alias

INTEGER

10

0

NUMBER 타입 alias

BIGINT

19

0

NUMBER 타입 alias

INT2

5

0

NUMBER 타입 alias

INT4

10

0

NUMBER 타입 alias

INT8

19

0

NUMBER 타입 alias

십진 부동 소수점 타입

십진 부동 소수점 타입은 SQL에서 정의한 타입이다.

십진 부동 소수점 타입

Type

Decimal precision

Decimal scale

참조

NUMBER

38

N/A

NUMBER

FLOAT( p )

ceil( log10 2p )

N/A

FLOAT

REAL

ceil( log10 224 ) = 8

N/A

FLOAT 타입의 alias

DOUBLE

ceil( log10 253 ) = 16

N/A

FLOAT 타입의 alias

FLOAT4

ceil( log10 224 ) = 8

N/A

FLOAT 타입의 alias

FLOAT8

ceil( log10 253 ) = 16

N/A

FLOAT 타입의 alias

이진 숫자 타입

유효 숫자의 정밀도를 나타내는 precision과 소수점의 범위를 나타내는 scale이 이진수 (binary)를 기반으로 한다.

이진 고정 소수점 타입

이진 고정 소수점 타입은 C 언어의 signed integer 계열 타입을 참조한다.
Sign bit를 표시하기 위해 1 bit를 사용하고 나머지 bit들은 precision을 표현하는데 사용하며 scale을 표현할 때는 bit를 사용하지 않는다.
이진 고정 소수점 타입

Type

Binary precision

Binary scale

참조

NATIVE_SMALLINT

15

0

NATIVE_SMALLINT

NATIVE_INTEGER

31

0

NATIVE_INTEGER

NATIVE_BIGINT

63

0

NATIVE_BIGINT

이진 부동 소수점 타입

이진 부동 소수점 타입은 C 언어의 float과 double 타입을 참조한다. 
Sign bit를 표시하기 위해 1 bit를 사용하고 나머지 bit들은 precision과 scale을 표현하기 위해 사용한다.
이진 부동 소수점 타입

Type

Binary precision

Binary scale

참조

NATIVE_REAL

23

8

NATIVE_REAL

NATIVE_DOUBLE

52

11

NATIVE_DOUBLE

이진 부동 소수점 타입에 대한 precision과 scale은 OS 및 compiler의 환경에 따라 변동될 수 있다.

CHARACTER STRING 타입

CHARACTER STRING 타입은 가변길이 문자열 여부와 문자열의 최대 길이에 따라 구분할 수 있다.

BINARY STRING 타입

BINARY STRING 타입은 가변길이 이진 문자열 여부와 이진 문자열의 최대 길이에 따라 구분할 수 있다.

날짜/ 시간 타입

날짜/ 시간 타입은 년, 월, 일, 시, 분, 초, time zone offset을 각 타입의 표현방식에 맞게 지정한다.
날짜/ 시간 타입에는 DATE, TIME, TIMESTAMP 타입이 있다.

INTERVAL 타입

INTERVAL 타입은 시간 간격을 지정한다.
년, 월, 일, 시, 분, 초의 시간 간격을 각 타입의 표현방식에 맞게 지정한다.
INTERVAL 타입은 값의 표현 범위에 따라 YEAR TO MONTH 계열과 DAY TO SECOND 계열로 구분할 수 있다.

BOOLEAN 타입

Boolean 타입은 TRUE, FALSE, UNKNOWN의 truth 값을 저장하며 UNKNOWN일 경우 null 값으로 표현한다. Condition으로 사용된 모든 expression들은 boolean 값을 반환하며, boolean type으로 정의된 column 또는 value는 condition으로 사용할 수 있다.
Boolean 타입으로 저장될 수 있는 literal은 다음과 같다.
자세한 내용은 BOOLEAN을 참조한다.

ROWID 타입

데이터베이스에 저장된 모든 레코드는 각기 다른 위치정보를 가지고 있으며, 각각의 레코드를 구분하기 위해 레코드 식별자 (ROWID)를 사용한다.
ROWID 타입은 레코드 식별자 (ROWID)를 저장 관리하기 위한 타입이다. 
ROWID pseudo column을 사용한 질의를 통해 레코드 식별자 (ROWID)를 얻을 수 있다.
자세한 내용은 ROWID를 참조한다.

타입간 비교

두 타입간의 비교는 하나의 대표 타입을 기준으로 수행된다. 비교 대상 타입이 대표 타입과 다를 경우 타입 변환을 통해 비교할 수도 있다.
타입간 비교를 위한 대표 타입에서는 두 타입간의 비교를 위한 대표 타입을 정의한다.
다음 표에서는 각 대표 타입별로 비교를 위해 대상 타입들을 변환하는 것에 대해 설명한다.

다음은 타입간 비교를 위해 사용하는 약어이다.

타입간 비교 표에서 built-in data type은 축약된 단어를 double quote (")로 묶어서 표기한다.

타입간 비교를 위한 대표 타입

Data

type

C

H

A

R

V

A

R

C

H

A

R

L

O

N

G


V

A

R

C

H

A

R

B

I

N

A

R

Y

V

A

R

B

I

N

A

R

Y

L

O

N

G


V

A

R

B

I

N

A

R

Y

N

A

T

I

V

E


S

M

A

L

L

I

N

T

N

A

T

I

V

E


I

N

T

E

G

E

R

N

A

T

I

V

E


B

I

G

I

N

T

N

A

T

I

V

E


R

E

A

L

N

A

T

I

V

E


D

O

U

B

L

E

N

U

M

B

E

R

N

U

M

E

R

I

C

F

L

O

A

T

D

A

T

E

T

I

M

E

T

I

M

E




T

Z

T

I

M

E

S

T

A

M

P

T

I

M

E

S

T

A

T

M

P



T

Z

I

N

T

E

R

V

A

L


Y

M

I

N

T

E

R

V

A

L


D

S

B

O

O

L

E

A

N

R

O

W

I

D

CHAR

VC

VC

LC




NU

NU

NU

NU

ND

NU

NU

NU

DA

TI

TZ

TS

SZ

YM

DS

BO

RI

VARCHAR

VC

VC

LC




NU

NU

NU

NU

ND

NU

NU

NU

DA

TI

TZ

TS

SZ

YM

DS

BO

RI

LONG VARCHAR

LC

LC

LC




NU

NU

NU

NU

ND

NU

NU

NU

DA

TI

TZ

TS

SZ

YM

DS

BO

RI

BINARY




VB

VB

LB


















VARBINARY




VB

VB

LB


















LONG VARBINARY




LB

LB

LB


















NATIVE_SMALLINT

NU

NU

NU




NB

NB

NB

ND

ND

NU

NU

NU






YM

DS



NATIVE_INTEGER

NU

NU

NU




NB

NB

NB

ND

ND

NU

NU

NU






YM

DS



NATIVE_BIGINT

NU

NU

NU




NB

NB

NB

ND

ND

NU

NU

NU






YM

DS



NATIVE_REAL

NU

NU

NU




ND

ND

ND

ND

ND

NU

NU

NU










NATIVE_DOUBLE

ND

ND

ND




ND

ND

ND

ND

ND

ND

ND

ND










NUMBER

NU

NU

NU




NU

NU

NU

NU

ND

NU

NU

NU






YM

DS



NUMERIC

NU

NU

NU




NU

NU

NU

NU

ND

NU

NU

NU






YM

DS



FLOAT

NU

NU

NU




NU

NU

NU

NU

ND

NU

NU

NU






YM

DS



DATE

DA

DA

DA












DA



TS

SZ





TIME

TI

TI

TI













TI

TZ







TIME_TZ

TZ

TZ

TZ













TZ

TZ







TIMESTAMP

TS

TS

TS












TS



TS

SZ





TIMESTAMP_TZ

SZ

SZ

SZ












SZ



SZ

SZ





INTERVAL_YM

YM

YM

YM




YM

YM

YM



YM

YM

YM






YM




INTERVAL_DS

DS

DS

DS




DS

DS

DS



DS

DS

DS







DS



BOOLEAN

BO

BO

BO



















BO


ROWID

RI

RI

RI




















RI

VC 에서의 비교를 위한 타입 변환

원본 타입

변환 타입

CHAR

CHAR (변환 없음)

VARCHAR

VARCHAR (변환 없음)

LC 에서의 비교를 위한 타입 변환

원본 타입

변환 타입

CHAR

CHAR (변환 없음)

VARCHAR

VARCHAR (변환 없음)

LONG VARCHAR

LONG VARCHAR (변환 없음)

VB 에서의 비교를 위한 타입 변환

원본 타입

변환 타입

BINARY

BINARY (변환 없음)

VARBINARY

VARBINARY (변환 없음)

LB 에서의 비교를 위한 타입 변환

원본 타입

변환 타입

BINARY

BINARY (변환 없음)

VARBINARY

VARBINARY (변환 없음)

LONG VARBINARY

LONG VARBINARY (변환 없음)

NB 에서의 비교를 위한 타입 변환

원본 타입

변환 타입

CHAR

NATIVE_BIGINT

VARCHAR

NATIVE_BIGINT

LONG VARCHAR

NATIVE_BIGINT

NATIVE_SMALLINT

NATIVE_SMALLINT (변환 없음)

NATIVE_INTEGER

NATIVE_INTEGER (변환 없음)

NATIVE_BIGINT

NATIVE_BIGINT (변환 없음)

ND 에서의 비교를 위한 타입 변환

원본 타입

변환 타입

CHAR

NATIVE_DOUBLE

VARCHAR

NATIVE_DOUBLE

LONG VARCHAR

NATIVE_DOUBLE

NATIVE_SMALLINT

NATIVE_SMALLINT (변환 없음)

NATIVE_INTEGER

NATIVE_INTEGER (변환 없음)

NATIVE_BIGINT

NATIVE_BIGINT (변환 없음)

NATIVE_REAL

NATIVE_REAL (변환 없음)

NATIVE_DOUBLE

NATIVE_DOUBLE (변환 없음)

NUMBER

NUMBER (변환 없음)

NUMERIC

NUMERIC (변환 없음)

FLOAT

FLOAT (변환 없음)

NU 에서의 비교를 위한 타입 변환

원본 타입

변환 타입

CHAR

NUMBER

VARCHAR

NUMBER

LONG VARCHAR

NUMBER

NATIVE_SMALLINT

NATIVE_SMALLINT (변환 없음)

NATIVE_INTEGER

NATIVE_INTEGER (변환 없음)

NATIVE_BIGINT

NATIVE_BIGINT (변환 없음)

NATIVE_REAL

NATIVE_REAL (변환 없음)

NATIVE_DOUBLE

NATIVE_DOUBLE (변환 없음)

NUMBER

NUMBER (변환 없음)

NUMERIC

NUMERIC (변환 없음)

FLOAT

FLOAT (변환 없음)

DA 에서의 비교를 위한 타입 변환

원본 타입

변환 타입

CHAR

DATE

VARCHAR

DATE

LONG VARCHAR

DATE

DATE

DATE (변환 없음)

TI 에서의 비교를 위한 타입 변환

원본 타입

변환 타입

CHAR

TIME

VARCHAR

TIME

LONG VARCHAR

TIME

TIME

TIME (변환 없음)

TZ 에서의 비교를 위한 타입 변환

원본 타입

변환 타입

CHAR

TIME_TZ

VARCHAR

TIME_TZ

LONG VARCHAR

TIME_TZ

TIME

TIME_TZ

TIME_TZ

TIME_TZ (변환 없음)

TS 에서의 비교를 위한 타입 변환

원본 타입

변환 타입

CHAR

TIMESTAMP

VARCHAR

TIMESTAMP

LONG VARCHAR

TIMESTAMP

DATE

DATE (변환 없음)

TIMESTAMP

TIMESTAMP (변환 없음)

SZ 에서의 비교를 위한 타입 변환

원본 타입

변환 타입

CHAR

TIMESTAMP_TZ

VARCHAR

TIMESTAMP_TZ

LONG VARCHAR

TIMESTAMP_TZ

DATE

TIMESTAMP_TZ

TIMESTAMP

TIMESTAMP_TZ

TIMESTAMP_TZ

TIMESTAMP_TZ (변환 없음)

YM 에서의 비교를 위한 타입 변환

원본 타입

변환 타입

CHAR

INTERVAL_YM

VARCHAR

INTERVAL_YM

LONG VARCHAR

INTERVAL_YM

NATIVE_SMALLINT

INTERVAL_YM

NATIVE_INTEGER

INTERVAL_YM

NATIVE_BIGINT

INTERVAL_YM

NUMBER

INTERVAL_YM

NUMERIC

INTERVAL_YM

FLOAT

INTERVAL_YM

INTERVAL_YM

INTERVAL_YM (변환 없음)

DS 에서의 비교를 위한 타입 변환

원본 타입

변환 타입

CHAR

INTERVAL_DS

VARCHAR

INTERVAL_DS

LONG VARCHAR

INTERVAL_DS

NATIVE_SMALLINT

INTERVAL_DS

NATIVE_INTEGER

INTERVAL_DS

NATIVE_BIGINT

INTERVAL_DS

NUMBER

INTERVAL_DS

NUMERIC

INTERVAL_DS

FLOAT

INTERVAL_DS

INTERVAL_DS

INTERVAL_DS (변환 없음)

BO 에서의 비교를 위한 타입 변환

원본 타입

변환 타입

CHAR

BOOLEAN

VARCHAR

BOOLEAN

LONG VARCHAR

BOOLEAN

BOOLEAN

BOOLEAN (변환 없음)

RI 에서의 비교를 위한 타입 변환

원본 타입

변환 타입

CHAR

ROWID

VARCHAR

ROWID

LONG VARCHAR

ROWID

ROWID

ROWID (변환 없음)

타입간 변환

타입간 변환은 내부 변환 (implicit type conversion)과 외부 변환 (explicit type conversion)으로 구분된다.
타입간 변환에서는 한 data type에서 다른 data type으로의 변환 가능 여부를 설명한다.

타입간 변환 표에서 built-in data type은 축약된 문자열을 double quote (")로 묶어서 표기한다.

타입간 변환

Data

type

C

H

A

R

V

A

R

C

H

A

R

L

O

N

G


V

A

R

C

H

A

R

B

I

N

A

R

Y

V

A

R

B

I

N

A

R

Y

L

O

N

G


V

A

R

B

I

N

A

R

Y

N

A

T

I

V

E


S

M

A

L

L

I

N

T

N

A

T

I

V

E


I

N

T

E

G

E

R

N

A

T

I

V

E


B

I

G

I

N

T

N

A

T

I

V

E


R

E

A

L

N

A

T

I

V

E


D

O

U

B

L

E

N

U

M

B

E

R

N

U

M

E

R

I

C

F

L

O

A

T

D

A

T

E

T

I

M

E

T

I

M

E




T

Z

T

I

M

E

S

T

A

M

P

T

I

M

E

S

T

A

T

M

P



T

Z

I

N

T

E

R

V

A

L


Y

M

I

N

T

E

R

V

A

L


D

S

B

O

O

L

E

A

N

R

O

W

I

D

CHAR

O

O

O




O

O

O

O

O

O

O

O

O

O

O

O

O

O

O

O

O

VARCHAR

O

O

O




O

O

O

O

O

O

O

O

O

O

O

O

O

O

O

O

O

LONG VARCHAR

O

O

O




O

O

O

O

O

O

O

O

O

O

O

O

O

O

O

O

O

BINARY




O

O

O


















VARBINARY




O

O

O


















LONG VARBINARY




O

O

O


















NATIVE_SMALLINT

O

O

O




O

O

O

O

O

O

O

O






O

O



NATIVE_INTEGER

O

O

O




O

O

O

O

O

O

O

O






O

O



NATIVE_BIGINT

O

O

O




O

O

O

O

O

O

O

O






O

O



NATIVE_REAL

O

O

O




O

O

O

O

O

O

O

O










NATIVE_DOUBLE

O

O

O




O

O

O

O

O

O

O

O










NUMBER

O

O

O




O

O

O

O

O

O

O

O






O

O



NUMERIC

O

O

O




O

O

O

O

O

O

O

O






O

O



FLOAT

O

O

O




O

O

O

O

O

O

O

O






O

O



DATE

O

O

O












O



O

O





TIME

O

O

O













O

O







TIME_TZ

O

O

O













O

O







TIMESTAMP

O

O

O












O

O


O

O





TIMESTAMP_TZ

O

O

O












O

O

O

O

O





INTERVAL_YM

O

O

O




O

O

O



O

O

O






O




INTERVAL_DS

O

O

O




O

O

O



O

O

O







O



BOOLEAN

O

O

O



















O


ROWID

O

O

O




















O

타입간 조합

타입간 조합이 필요한 경우

CASE 연산자, 집합 연산자 (set operator)는 다수의 expression을 연산 결과로 가진다.
다음 예와 같이 각 expression들이 서로 다른 타입을 가질 경우, 결과 타입을 결정해 주어야 한다.
SELECT CASE expr WHEN expr THEN char(3)
                 WHEN expr THEN char(5)
                 ELSE char(1)
       END   
  FROM t1;
SELECT float_column
  FROM t1
UNION ALL
SELECT number_precision_column
  FROM t2
UNION ALL
SELECT native_integer_column
  FROM t3;

타입간 조합에 의한 결과 타입 결정에 적용되는 규칙이 있는데 다음은 그 규칙을 적용하는 예이다.

결과 타입 조합 규칙

각 expression의 data type은 조합 가능한 동일한 계열의 타입이어야 한다.

결과 타입 조합 규칙에 따른 결과 타입은 아래 표에서 설명한다.

다음은 결과 타입 조합 규칙을 설명하기 위해 사용하는 약어이다.

결과 타입 조합 규칙에 따른 결과 타입 표에서 built-in data type은 축약된 문자열을 double quote (")로 묶어서 표기한다.

결과 타입 조합 규칙에 따른 결과 타입

Data

type

C

H

A

R

V

A

R

C

H

A

R

L

O

N

G


V

A

R

C

H

A

R

B

I

N

A

R

Y

V

A

R

B

I

N

A

R

Y

L

O

N

G


V

A

R

B

I

N

A

R

Y

N

A

T

I

V

E


S

M

A

L

L

I

N

T

N

A

T

I

V

E


I

N

T

E

G

E

R

N

A

T

I

V

E


B

I

G

I

N

T

N

A

T

I

V

E


R

E

A

L

N

A

T

I

V

E


D

O

U

B

L

E

N

U

M

B

E

R

N

U

M

E

R

I

C

F

L

O

A

T

D

A

T

E

T

I

M

E

T

I

M

E




T

Z

T

I

M

E

S

T

A

M

P

T

I

M

E

S

T

A

T

M

P



T

Z

I

N

T

E

R

V

A

L


Y

M

I

N

T

E

R

V

A

L


D

S

B

O

O

L

E

A

N

R

O

W

I

D

CHAR

VC

VC






















VARCHAR

VC

VC






















LONG VARCHAR



LC





















BINARY




VB

VB



















VARBINARY




VB

VB



















LONG VARBINARY






LB


















NATIVE_SMALLINT







NS

NI

NB

ND

ND

NU

NU

NU










NATIVE_INTEGER







NI

NI

NB

ND

ND

NU

NU

NU










NATIVE_BIGINT







NB

NB

NB

ND

ND

NU

NU

NU










NATIVE_REAL







ND

ND

ND

NR

ND

ND

ND

ND










NATIVE_DOUBLE







ND

ND

ND

ND

ND

ND

ND

ND










NUMBER







NU

NU

NU

ND

ND

NU

NU

NU










NUMERIC







NU

NU

NU

ND

ND

NU

NU

NU










FLOAT







NU

NU

NU

ND

ND

NU

NU

FL










DATE















DA



TS

SZ





TIME
















TI

TZ







TIME_TZ
















TZ

TZ







TIMESTAMP















TS



TS

SZ





TIMESTAMP_TZ















SZ



SZ

SZ





INTERVAL_YM




















YM




INTERVAL_DS





















DS



BOOLEAN






















BO


ROWID























RI

호환성

Data type에 대한 SQL 표준 호환성은 다음과 같다.

SQL 표준 호환성

Feature ID

설명

지원 여부

B033

Untyped SQL-invoked function arguments

X

E011-01

INTEGER and SMALLINT data types

O

E011-02

REAL, DOUBLE PRECISION, and FLOAT data types

O

E011-03

DECIMAL and NUMERIC data types

X

E011-04

Arithmetic operators

O

E011-05

Numeric comparison

O

E011-06

Implicit casting among the numeric data types

O

E021-01

CHARACTER data type

O

E021-02

CHARACTER VARYING data type

O

E021-03

Character literals

O

E021-04

CHARACTER_LENGTH function

O

E021-05

OCTET_LENGTH function

O

E021-06

SUBSTRING function

O

E021-07

Character concatenation

O

E021-08

UPPER and LOWER functions

O

E021-09

TRIM function

O

E021-10

Implicit casting among the fixed-length and variable-length character string types

O

E021-11

POSITION function

O

E021-12

Character comparison

O

E071-05

Columns combined via table operators need not have exactly the same data type

O

F051-01

DATE data type (including support of DATE literal)

O

F051-02

TIME data type (including support of TIME literal) with fractional seconds precision of at least 0

O

F051-03

TIMESTAMP data type (including support of TIMESTAMP literal) with fractional seconds precision of at least 0 and 6

O

F051-04

Comparison predicate on DATE, TIME, and TIMESTAMP data types

X

F051-05

Explicit CAST between datetime types and character string types

O

F054

TIMESTAMP in DATE type precedence list

X

F382

Alter column data type

O

F611

Indicator data types

X

F741

Referential MATCH types

X

J521

JDBC data types

X

J622

external Java types

X

S011-01

USER_DEFINED_TYPES view

X

S023

Basic structured types

X

S024

Enhanced structured types

X

S025

Final structured types

X

S026

Self-referencing structured types

X

S041

Basic reference types

X

S043

Enhanced reference types

X

S051

Create table of type

X

S071

SQL paths in function and type name resolution

X

S091-01

Arrays of built-in data types

X

S091-02

Arrays of distinct types

X

S092

Arrays of user-defined types

X

S094

Arrays of reference types

X

S161

Subtype treatment

X

S162

Subtype treatment for references

X

S201-02

Array as result type of functions

X

S231

Structured type locators

X

S261

Specific type method

X

S272

Multisets of user-defined types

X

S274

Multisets of reference types

X

S281

Nested collection types

X

S401

Distinct types based on array types

X

S402

Distinct types based on distinct types

X

T021

BINARY and VARBINARY data types

O

T022

Advanced support for BINARY and VARBINARY data types

O

T031

BOOLEAN data type

O

T041

Basic LOB data type support

X

T042

Extended LOB data type support

X

T051

Row types

X

T071

BIGINT data type

O

T201

Comparable data types for referential constraints

X

T322

Declared data type attributes

X

X010

XML type

X

X011

Arrays of XML type

X

X012

XMultisets of XML type

X

X013

Distinct types of XML type

X

X014

Attributes of XML type

X

X015

Fields of XML type

X

X181

XML(DOCUMENT(UNTYPED)) type

X

X182

XML(DOCUMENT(ANY)) type

X

X190

XML(SEQUENCE) type

X

X191

XML(DOCUMENT(XMLSCHEMA)) type

X

X192

XML(CONTENT(XMLSCHEMA)) type

X

X231

XML(CONTENT(UNTYPED)) type

X

X232

XML(CONTENT(ANY)) type

X

X251

Persistent XML values of XML(DOCUMENT(UNTYPED)) type

X

X252

Persistent XML values of XML(DOCUMENT(ANY)) type

X

X253

Persistent XML values of XML(CONTENT(UNTYPED)) type

X

X254

Persistent XML values of XML(CONTENT(ANY)) type

X

X255

Persistent XML values of XML(SEQUENCE) type

X

X256

Persistent XML values of XML(DOCUMENT(XMLSCHEMA)) type

X

X257

Persistent XML values of XML(CONTENT(XMLSCHEMA)) type

X

X260

XML type: ELEMENT clause

X

X261

XML type: NAMESPACE without ELEMENT clause

X

X263

XML type: NO NAMESPACE with ELEMENT clause

X

X264

XML type: schema location

X

X410

Alter column data type: XML type

X

Format 문자열

Format 문자열은 숫자 타입이나 날짜/ 시간 타입을 문자열로 변환하거나 문자열을 숫자 타입이나 날짜/ 시간 타입으로 변환하기 위한 형식을 정의한 문자열이다.
Format 문자열은 다음과 같은 타입으로 구분된다.
• 숫자 타입: Number Format 문자열
• 날짜/ 시간 타입: Datetime Format 문자열

Number Format 문자열

Number format 문자열은 숫자 타입을 문자열로 변환하거나 문자열을 숫자 타입으로 변환하기 위한 형식을 정의한 문자열이다.
Number format 문자열은 TO_CHAR( number ), TO_NATIVE_SMALLINT, TO_NATIVE_INTEGER, TO_NATIVE_BIGINT, TO_NUMBER, TO_NATIVE_REAL, TO_NATIVE_DOUBLE 함수의 인자로 사용된다.
Number format 문자열에는 표현하고자 하는 형식에 따라 여러 개의 format element를 지정할 수 있다.
모든 number format element는 그 형식에 맞게 반올림하여 적용한다.
변환하고자 하는 value의 소수점 이전 digit 개수가 format 문자열에 지정된 숫자의 자리수보다 큰 경우, '#' 문자로 대체된다.
MI, S, PR의 부호를 표현하는 format element를 지정하지 않은 경우, 음수는 숫자 앞에 '-' 부호를 양수는 공백을 반환하는 방식으로 부호를 표현한다.
Number format elements

Format

element

예제

설명

, (comma)

9,999

지정한 위치에 comma를 반환한다.

Comma를 여러 개 지정할 수 있다.

Format 문자열은 comma로 시작할 수 없고 소수점 (.) 이후에도 올 수 없다.

. (period)

99.99

지정한 위치에 소수점 (.)을 반환한다.

Format 문자열 내에서 소수점은 한 번만 지정할 수 있다.

$

$9999

숫자 앞에 $ 기호를 반환한다.

0

0999

9990

숫자 앞이나 끝에 0을 반환한다.

변환하고자 하는 value의 digit 개수가 format 문자열의 0 위치까지의 digit 개수보다 작은 경우, 차이나는 부분을 0으로 채워 반환한다.

9

9999

부호와 명시된 9의 개수에 맞게 공백과 숫자를 반환한다.

변환하고자 하는 value의 digit 개수가 명시된 9의 개수보다 작은 경우, 차이나는 부분을 공백으로 채워 반환한다.

음수인 경우 숫자 앞에 '-' 부호를 양수는 공백을 반환하는 방식으로 부호를 표현한다.

Format 문자열 소수점 이전의 정수부로 표현되는 값이 0인 경우, 이 0은 공백으로 반환된다.

예: TO_CHAR( 0.123, '9.999' ) → .123

예: TO_CHAR( 0, '9' ) → 0

B

B9999

값이 0 이 되는 경우, 공백을 반환한다.

EEEE

9.9EEEE

지수 표기법으로 반환한다.

Format 문자열의 맨 마지막에 오거나, S, MI, PR 앞에 올 수 있다.

Comma (,)와 함께 지정할 수 없다.

MI

9999MI

음수인 경우 숫자 끝에 '-' 를 양수인 경우 공백을 반환한다.

Format 문자열의 마지막에만 지정할 수 있고, S, PR과 함께 지정할 수 없다.

PR

9999PR

음수인 경우 꺽쇠 괄호 안에 숫자를 반환한다. <숫자>

양수인 경우 숫자 앞뒤에 공백이 반환된다.

Format 문자열의 마지막에만 지정할 수 있고, S, MI와 함께 지정할 수 없다.

RN

rn

RN

rn

로마 숫자를 대문자로 반환한다.

로마 숫자를 소문자로 반환한다.

1 ~ 3999 사이의 숫자에서만 반환된다.

FM format element 이외의 다른 format element와는 함께 지정할 수 없다.

TO_NUMBER 함수에는 사용할 수 없다.

S

S9999

9999S

양수인 경우 숫자 앞에 '+' 부호를 음수인 경우 '-' 부호를 반환한다. (S9999)

양수인 경우 숫자 끝에 '+' 부호를 음수인 경우 '-' 부호를 반환한다. (9999S)

Format 문자열의 맨 처음 또는 맨 마지막에만 지정할 수 있다.

MI, PR과 함께 지정할 수 없다.

V

999V99

V format element 뒤에 오는 9의 digit 개수가 n일 때, value에 10n 을 곱한 값을 반환한다.

소수점(.)과 함께 지정할 수 없다.

TO_NUMBER 함수에는 사용할 수 없다.

X

XXXX

xxxx

지정된 X digit 수에 맞게 공백과 16 진수를 반환한다.

정수값을 16 진수로 반환한다. (정수가 아닌 경우 반올림하여 정수값을 만든다.)

XXXX는 16 진수 대문자를 xxxx는 16 진수 소문자를 반환한다.

변환된 16 진수 digit 개수가 명시된 X의 개수보다 작은 경우, 차이나는 부분을 공백으로 채워 반환한다.

0과 양의 정수만 처리하고, 음수인 경우 '#' 문자로 대체된다.

Format element 0 및 FM과만 함께 지정할 수 있으며, 다른 format element와는 함께 지정할 수 없다.

FM

FM

앞 뒤 공백을 제거하여 왼쪽 정렬되는 효과를 반환한다.

숫자 앞 뒤에 붙는 공백을 제거한다.

9 format element에 의해 소수점 이하에 추가된 0을 제거한다.

다음은 number format 문자열을 사용하는 예이다.

TO_CHAR( 12345, '99,999' )           : ' 12,345'
TO_CHAR( 123456789, '999,999,999' )  : ' 123,456,789'
TO_CHAR( 12.345, '99.999' )          : ' 12.345'
TO_CHAR( 1234.56, '$9,999.99' )      : ' $1,234.56'
TO_CHAR( 123, '099999' )             : ' 000123'
TO_CHAR( 0.2, '0.9' )                : ' 0.2'
TO_CHAR( 123.45, '999999.99' )       : '    123.45'
TO_CHAR( -123.45, '999999.99' )      : '   -123.45'
TO_CHAR( 123.45, 'FM999999.99' )     : '123.45'
TO_CHAR( -123.45, 'FM999999.99' )    : '-123.45'
TO_CHAR( 12345.67, '999.99' )        : '#######'
TO_CHAR( 123.100567, '999.999' )     : ' 123.101'
TO_CHAR( 0.2, '90.99' )              : '  0.20'
TO_CHAR( 0.2, '99.99' )              : '   .20'
TO_CHAR( 0, '90.99' )                : '  0.00'
TO_CHAR( 0, 'B90.99' )               : '      '
TO_CHAR( 123.45, '9.9EEEE' )         : '  1.2E+02'
TO_CHAR( 123.45, '999.99MI' )        : '123.45 '
TO_CHAR( -123.45, '999.99MI' )       : '123.45-'
TO_CHAR( 123.45, '999.99PR' )        : ' 123.45 '
TO_CHAR( -123.45, '999.99PR' )       : '<123.45>'
TO_CHAR( 123, 'RN' )                 : '         CXXIII'
TO_CHAR( 123, 'rn' )                 : '         cxxiii'
TO_CHAR( 123, 'FMRN' )               : 'CXXIII'
TO_CHAR( 4000, 'RN' )                : '###############'
TO_CHAR( 123.45, 'S999.99' )         : '+123.45'
TO_CHAR( -123.45, 'S999.99' )        : '-123.45'
TO_CHAR( 123.45, '999.99S' )         : '123.45+'
TO_CHAR( -123.45, '999.99S' )        : '123.45-'
TO_CHAR( 123.45, '999V999' )         : ' 123450'
TO_CHAR( 123, 'XX' )                 : ' 7B'
TO_CHAR( 123, 'xx' )                 : ' 7b'
TO_CHAR( 45678, 'XXXXXXX' )          : '    B26E'
TO_CHAR( 45678, 'FMXXXXXXX' )        : 'B26E'
TO_CHAR( 123.45, '99,999.999999' )   : '    123.450000'
TO_CHAR( 123.45, 'FM99,999.999999' ) : '123.45'

Datetime Format 문자열

Datetime format 문자열은 날짜/ 시간 타입을 문자열로 변환하거나 문자열을 날짜/ 시간 타입으로 변환하기 위한 형식을 정의한 문자열이다.
Datetime format 문자열은 TO_CHAR( datetime ), TO_DATE, TO_TIMESTAMP, TO_TIMESTAMP_WITH_TIME_ZONE, TO_TIME, TO_TIME_WITH_TIME_ZONE 함수의 인자로 사용된다.
날짜/ 시간 타입의 경우, format 문자열을 지정하지 않으면 default 값으로 처리되는데, 각 타입의 default 값은 session property인 NLS_*_FORMAT에 지정된 값이다.
NLS_*_FORMAT 값들은 ALTER SESSION SET property_name 구문으로 변경할 수 있다.
Datetime format 문자열에는 표현하고자 하는 형식에 따라 여러 개의 format element를 지정할 수 있다.
Datetime format elements

Format

element

TO_*

datetime

사용여부

설명

-

/

,

.

;

:

"text"

특수문자

Y

지정된 위치에 format element의 문자를 반환한다.

AD

A.D.

Y

서기

AM

A.M.

Y

오전

BC

B.C.

Y

기원전

CC

N

세기

네 자리 연도 중 마지막 두 자리가 01 ~ 99 이면 처음 두 자리에 1을 더한 값을 반환한다. (예: 2005년도일 경우 21)

네 자리 연도 중 마지막 두 자리가 00 이면 처음 두 자리 값이 반환된다. (예: 2000년도일 경우 20)

D

Y

일주일 중 몇 번째 날인지를 반환한다. (1 ~ 7)

일요일 (1) ~ 토요일 (7)

DAY

Day

day

Y

요일을 반환한다. ( 예: SUNDAY )

  • DAY: 모두 대문자로 반환한다.

  • Day: 첫 번째 문자만 대문자로 반환하고 그 외는 소문자로 반환한다.

  • day: 모두 소문자로 반환한다.

DD

Y

달의 몇 번째 날인지를 반환한다. (1 ~ 31)

DDD

Y

연도의 몇 번째 날인지를 반환한다. (1 ~ 366)

DY

Dy

dy

Y

요일의 약어를 반환한다. (예: SUN)

  • DY: 모두 대문자로 반환한다.

  • Dy: 첫 번째 문자만 대문자로 반환하고 그 외는 소문자로 반환한다.

  • dy: 모두 소문자로 반환한다.

FF[1..6]

Y

Fractional seconds를 FF 이후에 지정한 숫자 (1 ~ 6)의 개수만큼 반환한다.

숫자를 지정하지 않은 경우, 기본값은 6이다. (FF는 FF6과 같다.)

Fractional seconds의 digit 개수가 FF 이후에 지정한 숫자보다 많으면 버림처리된다.

Fractional seconds의 digit 개수가 FF 이후에 지정한 숫자보다 적으면 지정된 숫자에 맞추어 0이 추가된다.

DATE 타입에서는 사용할 수 없다.

HH

HH12

Y

시간 (1 ~ 12)

HH24

Y

시간 (0 ~ 23)

IW

N

ISO 8601 표준에 정의된 calendar week (1 ~ 52주 또는 1 ~ 53주)로 지정된 연도의 첫 번째 목요일이 있는 주가 첫 번째 주가 된다.

  • Calendar week는 monday부터 시작한다.

  • First calendar week는 1월 4일을 포함한다.

  • First calendar week는 12월 29, 30, 31을 포함할 수 있다.

  • Last calendar week는 1월 1, 2, 3을 포함할 수 있다.

IYYY

N

ISO 8601 표준에 정의된 calendar week를 수용하는 4자리 연도이다.

IYY

IY

I

N

ISO 8601 표준에 정의된 calendar week를 수용하는 3자리 연도이다.

ISO 8601 표준에 정의된 calendar week를 수용하는 2자리 연도이다.

ISO 8601 표준에 정의된 calendar week를 수용하는 1자리 연도이다.

J

Y

BC 4714-11-24 일부터 경과된 날짜를 반환한다.

MI

Y

분 (0 ~ 59)

MM

Y

월 (01 ~ 12), 1월 (01) ~ 12월 (12)

MON

Mon

mon

Y

월의 약어 (예: JAN ) 이다.

  • MON: 모두 대문자로 반환한다.

  • Mon: 첫 번째 문자만 대문자로 반환하고 그 외는 소문자로 반환한다.

  • mon: 모두 소문자로 반환한다.

MONTH

Month

month

Y

월의 이름 (예: JANUARY) 이다.

  • MONTH: 모두 대문자로 반환한다.

  • Month: 첫 번째 문자만 대문자로 반환하고 그 외는 소문자로 반환한다.

  • month: 모두 소문자로 반환한다.

PM

P.M.

Y

오후

Q

N

연도의 분기 (1 ~ 4) 이다.

1월에서 3월 (1) ~ 10월에서 12월 (4) 이다.

RM

Rm

rm

Y

월을 로마숫자로 반환한다. (예: I)

  • RM: 모두 대문자로 반환한다.

  • Rm: 첫 번째 문자만 대문자로 반환하고 그 외는 소문자로 반환한다.

  • rm: 모두 소문자로 반환한다.

RR

Y

조정된 두 자리 연도이다.

RR로 표현된 두 자리 연도를 네 자리 연도로 표현하는 방법은 다음과 같다.

  • RR로 표현된 두 자리 연도가 00 ~ 49인 경우

    • 현재 연도의 마지막 두 자리가 00 ~ 50 이면,

      • 현재 연도의 처음 두 자리와 RR로 표현된 두 자리 연도

    • 현재 연도의 마지막 두 자리가 51 ~ 99 이면,

      • (현재 연도의 처음 두 자리 + 1)와 RR로 표현된 두 자리 연도

  • RR로 표현된 두 자리 연도가 50 ~ 99 인 경우

    • 현재 연도의 마지막 두 자리가 00 ~ 50 이면,

      • (현재 연도의 처음 두 자리 - 1 )와 RR로 표현된 두 자리 연도

    • 현재 연도의 마지막 두 자리가 51 ~ 99 이면,

      • 현재 연도의 처음 두 자리와 RR로 표현된 두 자리 연도

RRRR

Y

조정된 네 자리 연도이다.

네 자리 또는 두 자리로 입력받을 수 있다.

두 자리로 입력받을 경우, RR과 동일하게 처리된다.

SS

Y

초 (0 ~ 59)

SSSSS

Y

지난 자정을 기준으로 경과된 초 (0 ~ 86399) 이다.

TZH

Y

Time zone hour 이다.

DATE, TIMESTAMP, TIME 타입에서는 사용할 수 없고, TIMESTAMP WITH TIME ZONE, TIME WITH TIME ZONE 타입에서만 사용할 수 있다.

TZM

Y

Time zone minute 이다.

DATE, TIMESTAMP, TIME 타입에서는 사용할 수 없고, TIMESTAMP WITH TIME ZONE, TIME WITH TIME ZONE 타입에서만 사용할 수 있다.

WW

N

연도의 몇 번째 주 (1 ~ 53) 인지를 반환한다.

첫 번째 주 1은 1월 1일부터 7일까지이다.

W

N

월의 몇 번째 주 (1 ~ 5)인지 반환한다.

첫 번째 주 1은 월의 1일부터 7일까지이다.

Y,YYY

Y

Comma가 포함된 Y,YYY 형식의 연도를 반환한다.

YYYY

SYYYY

Y

네자리 연도이다.

SYYYY는 연도의 부호를 표기한다.

  • BC인 경우 '-'로 , AD인 경우 ' ' 로 표기된다.

YYY

YY

Y

Y

  • YYY: 현재 연도의 마지막 3자리 연도이다.

  • YY: 현재 연도의 마지막 2자리 연도이다.

  • Y: 현재 연도의 마지막 1자리 연도이다.

다음은 datetime format 문자열을 사용하는 예이다.

* - / , . ; : "text" Special character 
  • TO_CHAR( TO_DATE( '2012-07-15 03:30:30', 'YYYY-MM-DD HH12:MI:SS' ),
             'YYYY/MM/DD HH12:MI:SS' )
    ==> '2012/07/15 03:30:30'
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 
             'YYYY"year" DDD"th day"' )
    ==> '2012year 197th day'
* AD
  • TO_CHAR( TO_DATE( '2012-07-15 AD', 'YYYY-MM-DD AD' ), 'YYYY AD' )
    ==> '2012 AD'
  • TO_CHAR( TO_DATE( '0001-01-01 BC', 'YYYY-MM-DD AD'), 'YYYY AD' )
    ==> '0001 BC'

* BC 
  • TO_CHAR( TO_DATE( '0001-01-01 BC', 'YYYY-MM-DD BC'), 'YYYY BC' )
    ==> '0001 BC'
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'YYYY BC' )
    ==> '2012 AD'
* AM
  • TO_CHAR( TO_DATE( '2012-07-15 03:30:30 AM',
                      'YYYY-MM-DD HH12:MI:SS AM' ),
             'HH12:MI:SS AM' )
    ==> '03:30:30 AM'
  • TO_CHAR( TO_DATE( '2012-07-15 21:30:30', 'YYYY-MM-DD HH24:MI:SS' ),
             'HH12:MI:SS AM' )
    ==> '09:30:30 PM'

* PM 
  • TO_CHAR( TO_DATE( '2012-07-15 03:30:30', 
                      'YYYY-MM-DD HH24:MI:SS' ), 
             'HH12:MI:SS PM' )
    ==> '03:30:30 AM'
  • TO_CHAR( TO_DATE( '2012-07-15 09:30:30 PM', 
                      'YYYY-MM-DD HH12:MI:SS PM' ), 
             'HH12:MI:SS PM' )
    ==> '09:30:30 PM'
* CC
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'CC' )
    ==> '21'
* D
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'D' )
    ==> '1'

* DD
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'DD' )
    ==>  '15'

* DDD
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'DDD' )
    ==> '197'
* DAY
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'DAY' )
    ==> 'SUNDAY   '
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'Day' )
    ==> 'Sunday   '
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'day' )
    ==> 'sunday   '

* DY
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'DY' )
    ==> 'SUN'
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'Dy' )
    ==> 'Sun'
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'dy' )
    ==> 'sun'
* FF[1 ... 6]
  • TO_CHAR( TO_TIMESTAMP( '2012-07-15 03:30:45.123456', 
                           'YYYY-MM-DD HH24:MI:SS.FF6' ), 
             'FF' )
    ==> '123456'
  • TO_CHAR( TO_TIMESTAMP( '2012-07-15 03:30:45.123456', 
                           'YYYY-MM-DD HH24:MI:SS.FF6' ), 
             'FF5' )
    ==> '12345'
  • TO_CHAR( TO_TIMESTAMP( '2012-07-15 03:30:45.9',
                           'YYYY-MM-DD HH24:MI.SS.FF1' ) , 
             'FF6' )
    ==> '900000'
* HH HH12 HH24
  • TO_CHAR( TO_TIMESTAMP( '2012-07-15 03:30:45.123456', 
                           'YYYY-MM-DD HH24:MI:SS.FF6' ), 
             'HH12' )
    ==> '03'
  • TO_CHAR( TO_TIMESTAMP( '2012-07-15 23:30:45.123456', 
                           'YYYY-MM-DD HH24:MI:SS.FF6' ), 
             'HH12' )
    ==> '11'
  • TO_CHAR( TO_TIMESTAMP( '2012-07-15 23:30:45.123456', 
                           'YYYY-MM-DD HH24:MI:SS.FF6' ), 
             'HH24' )
    ==> '23'
* IW
  • TO_CHAR( DATE'2016-01-01', 'IW' )
    ==> 53
  • TO_CHAR( DATE'2014-12-30', 'IW' )
    ==> 01
* IYYY
  • TO_CHAR( DATE'2016-01-01', 'IYYY' )
    ==> 2015
  • TO_CHAR( DATE'2014-12-30', 'IYYY' )
    ==> 2015

* IYY
  • TO_CHAR( DATE'2016-01-01', 'IYY' )
    ==> 015

* IY
  • TO_CHAR( DATE'2016-01-01', 'IY' )
    ==> 15

* I
  • TO_CHAR( DATE'2016-01-01', 'I' )
    ==> 5
* J
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'J' )
    ==> '2456124'
  • TO_CHAR( TO_DATE( '2456124', 'J' ), 'YYYY-MM-DD' )
    ==> '2012-07-15'
* MI
  • TO_CHAR( TO_TIMESTAMP( '2012-07-15 23:30:45.123456', 
             'YYYY-MM-DD HH24:MI:SS.FF6' ), 
             'MI' ) 
    ==> '30'
* MM
  • TO_CHAR( TO_TIMESTAMP( '2012-07-15 23:30:45.123456', 
                           'YYYY-MM-DD HH24:MI:SS.FF6' ), 
             'MM' )
    ==> '07'
* MON
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'MON' )
    ==> 'JUL'
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'Mon' )
    ==> 'Jul'
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'mon' )
    ==> 'jul'

* MONTH
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'MONTH' )
    ==> 'JULY     '
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'Month' )
    ==> 'July     '
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'month' )
    ==> 'july     '
* Q
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'Q' )
    ==> '3'
* RM
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'RM' )
    ==> 'VII ' 
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'Rm' )
    ==> 'Vii '
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'rm' )
    ==> 'vii '
* RR, RRRR ( 현재연도가 2014 인 경우 )
  • TO_CHAR( TO_DATE( '49-07-15', 'RR-MM-DD' ), 'RRRR' )
    ==> '2049'
  • TO_CHAR( TO_DATE( '49-07-15', 'RR-MM-DD' ), 'YYYY' )
    ==> '2049'
  • TO_CHAR( TO_DATE( '50-07-15', 'RR-MM-DD' ), 'RRRR' )
    ==> '1950'
  • TO_CHAR( TO_DATE( '50-07-15', 'RR-MM-DD' ), 'YYYY' )
    ==> '1950'
  • TO_CHAR( TO_DATE( '50-07-15', 'YY-MM-DD' ), 'RRRR' )
    ==> '2050'
  • TO_CHAR( TO_DATE( '49-07-15', 'RRRR-MM-DD' ), 'YYYY' )
    ==> '2049'
  • TO_CHAR( TO_DATE( '50-07-15', 'RRRR-MM-DD' ), 'YYYY' )
    ==> '1950'

* RR, RRRR ( 현재연도가 2051 인 경우 )
  • TO_CHAR( TO_DATE( '49-07-15', 'RR-MM-DD' ), 'RRRR' )
    ==> '2149'
  • TO_CHAR( TO_DATE( '49-07-15', 'RR-MM-DD' ), 'YYYY' )
    ==> '2149'
  • TO_CHAR( TO_DATE( '50-07-15', 'RR-MM-DD' ), 'RRRR' )
    ==> '2050'
  • TO_CHAR( TO_DATE( '50-07-15', 'RR-MM-DD' ), 'YYYY' )
    ==> '2050'
  • TO_CHAR( TO_DATE( '50-07-15', 'YY-MM-DD' ), 'RRRR' )
    ==> '2050'
  • TO_CHAR( TO_DATE( '49-07-15', 'RRRR-MM-DD' ), 'YYYY' )
    ==> '2149'
  • TO_CHAR( TO_DATE( '50-07-15', 'RRRR-MM-DD' ), 'YYYY' )
    ==> '2050'
* SS
  • TO_CHAR( TO_TIMESTAMP( '2012-07-15 23:30:45.123456',
                           'YYYY-MM-DD HH24:MI:SS.FF6' ), 
             'SS' )
    ==> '45' 

* SSSSS
  • TO_CHAR( TO_TIMESTAMP( '2012-07-15 23:30:45.123456',
                           'YYYY-MM-DD HH24:MI:SS.FF6' ), 
             'SSSSS' )
    ==> '84645'
* TZH 
  • TO_CHAR( TO_TIMESTAMP_TZ( '2012-07-15 23:30:45.123456 +09:00',
                              'YYYY-MM-DD HH24:MI:SS.FF6 TZH:TZM' ),
             'TZH' )
    ==> '+09'

* TZM
  • TO_CHAR( TO_TIMESTAMP_TZ( '2012-07-15 23:30:45.123456 +09:00',
                              'YYYY-MM-DD HH24:MI:SS.FF6 TZH:TZM' ),
             'TZM' )
    ==> '00'

  • TO_CHAR( TO_TIMESTAMP_TZ( '2012-07-15 23:30:45.123456 +09:00',
                              'YYYY-MM-DD HH24:MI:SS.FF6 TZH:TZM' ),
             'TZH:TZM' )
    ==> '+09:00'
* WW
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'WW' )
    ==> '29'

* W
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'W' )
    ==> '3'
* Y,YYY
  • TO_CHAR( TO_DATE( '2,012-07-15', 'Y,YYY-MM-DD' ), 'Y,YYY' )
    ==> '2,012'

* YYYY
  • TO_CHAR( TO_DATE( '2012-07-15', 'YYYY-MM-DD' ), 'YYYY' )
    ==> '2012'

* SYYYY
  • TO_CHAR( TO_DATE( '-0001-01-01', 'SYYYY-MM-DD' ), 'SYYYY' )
    ==> '-0001' 
  • TO_CHAR( TO_DATE( '2000-01-01', 'SYYYY-MM-DD' ), 'SYYYY' )
    ==> ' 2000'

* YYY  • TO_CHAR( TO_DATE( '012-07-15', 'YYY-MM-DD' ), 'YYY' )
    ==> '012'
  • TO_CHAR( TO_DATE( '012-07-15', 'YYY-MM-DD' ), 'YYYY' )
    ==> '2012' ( (현재 연도 / 1000년)이 2 인 경우 )

* YY
  • TO_CHAR( TO_DATE( '12-07-15', 'YY-MM-DD' ), 'YY' )
    ==> '12'
  • TO_CHAR( TO_DATE( '12-07-15', 'YY-MM-DD' ), 'YYYY' )
    ==> '2012' ( (현재 연도 / 100년)이 20 인 경우 ) 
    ==> '2112' ( (현재 연도 / 100년)이 21 인 경우 ) 

* Y
  • TO_CHAR( TO_DATE( '2-07-15', 'Y-MM-DD' ), 'Y' )
    ==> '2'
  • TO_CHAR( TO_DATE( '12-07-15', 'YY-MM-DD' ), 'YYYY' )
    ==> '2012' ( (현재 연도 / 10년)이 201 인 경우 )
    ==> '2052' ( (현재 연도 / 10년)이 205 인 경우 )

Expressions

Expression은 데이터 값을 얻기 위한 value, operator, function 들의 조합이다.
Expression이 사용될 수 있는 SQL 구문의 위치는 다음과 같다.
• SELECT target절
• SELECT의 GROUP BY절
• SELECT의 ORDER BY절
• SELECT의 WHERE절, HAVING절
• INSERT VALUES절
• UPDATE SET절
• INSERT, DELETE, UPDATE의 RETURN절
Expression 형태는 다음과 같이 다양하다.
• Simple expression
• Compound expresssion
• Boolean value expression
• Case expression
• Datetime expression
• Scalar subquery expression
• Sequence manipulation expression
Simple expression: Column, pseudo columns, literals, null value
Compound expression: 여러 개의 expression의 조합
자세한 내용은 다음을 참조한다.
• Null ValueLiteralsPseudo ColumnsOperatorsFunctions

Boolean Value Expression

구문

<boolean value expression> ::=
        <boolean term>
      | <boolean value expression> OR <boolean term>

<boolean term> ::=
        <boolean factor>
      | <boolean term> AND <boolean factor>

<boolean factor> ::=
        [ NOT ] <boolean test>

<boolean test> ::=
        <boolean primary> [ IS [ NOT ] <truth value> ]

<truth value> ::=
        TRUE
      | FALSE
      | UNKNOWN

<boolean primary> ::=
        <column>
        <condition>
      | <boolean predicand>

<boolean predicand> ::=
        <parenthesized boolean value expression>
      | <nonparenthesized value expression primary>

<parenthesized boolean value expression> ::=
        <left paren> <boolean value expression> <right paren>

설명

<boolean value expression>은 boolean value를 기술한다. Boolean value를 갖는 <boolean primary>는 <column>과 <condition>, <boolean predicand>가 있다. <column>의 경우 BOOLEAN type으로 선언되어야 하고 CAST를 이용하여 boolean value를 반환할 수도 있다.

<boolean value expression>은 AND나 OR, NOT 등과 같은 논리 연산자와 함께 사용할 수 있으며 boolean value만의 연산자인 IS, IS NOT을 지원한다.

<boolean test>에 기술된 IS, IS NOT 연산자는 <boolean primary>에 기술된 boolean value가 <truth value>인 TRUE, FALSE, UNKNOWN 중 하나와 일치하는지 여부를 판단한다.

자세한 내용은 Conditions를 참조한다.

사용 예

gSQL> SELECT * FROM T1 WHERE CAST('TRUE' AS BOOLEAN);

I1   
-----
TRUE 
FALSE
null 

3 rows selected.

gSQL> SELECT * FROM T1 WHERE I1;

I1  
----
TRUE

1 row selected.

gSQL> SELECT * FROM T1 WHERE I1 IS TRUE;

I1  
----
TRUE

1 row selected.

gSQL> SELECT * FROM T1 WHERE I1 IS NOT FALSE;

I1  
----
TRUE
null

2 rows selected.

gSQL> SELECT * FROM T1 WHERE I1 IS UNKNOWN;

I1  
----
null

1 row selected.

CASE Expression

구문

<case expression> ::=
        <simple case>
      | <searched case>

<simple case> ::=
        CASE expr WHEN comparison_expr THEN result 
                 [ WHEN comparison_expr THEN result ... ] 
                 [ ELSE result ]
        END

<searched case> ::=
        CASE WHEN condition THEN result
             [ WHEN condition THEN result ... ] 
             [ ELSE result ]
        END

설명

CASE 문에 기술된 순서대로 WHEN ... THEN 절을 평가한다.
비교 결과가 FALSE이면, TRUE가 나올 때까지 이후의 WHEN ... THEN 절을 평가한다.
비교 결과가 TRUE이면, result를 반환하고 이후는 평가하지 않는다.
• Simple case 
  CASE expr과 WHEN ... THEN 절의 comparison_expr을 equal 연산 (expr = comparison_expr)으로 평가한다.
• Searched case
  WHEN ... THEN 절의 condition을 평가한다.
WHEN 절을 평가한 결과가 모두 FALSE인 경우에는 ELSE 절의 result를 반환한다.
ELSE 절이 생략된 경우, result로 NULL을 반환한다.
THEN 또는 ELSE 절의 result에 여러 type이 오는 경우, 결과 타입 조합 규칙에 따라 result type을 결정한다.
자세한 내용은 다음을 참조한다.
• COALESCENULLIF

사용 예

gSQL> SELECT I1,
             CASE I1 WHEN 1 THEN 'ONE'
                     WHEN 2 THEN 'TWO'
                     ELSE 'NUMBER'
             END AS CASE_RESULT1,
             CASE I1 WHEN 1 THEN 'ONE'
                     WHEN 2 THEN 'TWO'
             END AS CASE_RESULT2
        FROM T1;
I1 CASE_RESULT1 CASE_RESULT2
-- ------------ -----------
 1 ONE          ONE        
 2 TWO          TWO        
 3 NUMBER       null       
3 rows selected.
gSQL> SELECT I1,
             CASE WHEN I1 = 1 THEN 'ONE'
                  WHEN I1 = 2 THEN 'TWO'
                  ELSE 'NUMBER'    
             END AS CASE_RESULT1,
             CASE WHEN I1 = 1 THEN 'ONE'
                  WHEN I1 = 2 THEN 'TWO'
             END AS CASE_RESULT2 
        FROM T1;
I1 CASE_RESULT1 CASE_RESULT2
-- ------------ ------------
 1 ONE          ONE         
 2 TWO          TWO         
 3 NUMBER       null        
3 rows selected.

CAST specification

구문

CAST( expression AS data_type )

설명

CAST는 expression의 데이터 타입을 지정된 data_type의 데이터 타입으로 변환한다.

사용 예

gSQL> SELECT CAST( '1-2' AS INTERVAL YEAR TO MONTH ) AS RESULT FROM DUAL;  
RESULT
------
+01-02
1 row selected.

Scalar Subquery Expression

Scalar subquery expression은 하나의 column을 갖는 row 하나를 결과값으로 반환하는 subquery 이다. Scalar subquery expression의 결과값은 subquery의 <select list>에 기술한 값이다.

만약 subquery가 0개의 row를 반환한다면 결과값은 NULL이며, 둘 이상의 row를 반환한다면 에러로 처리된다.

Scalar subquery expression은 expression을 기술하는 대부분의 위치에 기술할 수 있는데 subquery를 기술할 때는 반드시 괄호로 묶어야 한다. 함수 등의 인자로 사용되어 괄호 안에 scalar subquery expression이 기술되는 경우에도 함수의 괄호와 별도로 subquery를 위한 괄호로 묶어야 하며 그렇지 않은 경우 에러로 처리된다.

다음은 scalar subquery expression을 사용하는 예이다.

gSQL> select * from dual where dummy = (select * from dual);

DUMMY
-----
X    

1 row selected.

gSQL> select sum(select 1 from dual) from dual;

ERR-42000(40000): syntax error 
select sum(select 1 from dual) from dual
...........^    ^
Error at line 1

gSQL> select sum((select 1 from dual)) from dual;

SUM((SELECT 1 FROM DUAL))
-------------------------
                        1

1 row selected.

호환성

Expression에 대한 SQL 표준 호환성은 다음과 같다.

SQL 표준 호환성

Feature ID

설명

지원 여부

E121-03

Value expressions in ORDER BY clause

O

F051-05

Basic date and time Explicit CAST between datetime types and character string types

O

F201

CAST function

O

F261-01

Simple CASE

O

F261-02

Searched CASE

O

F261-03

NULLIF

O

F261-04

COALESCE

O

F263

Comma-separated predicates in simple CASE expression

X

F301

CORRESPONDING in query expressions

X

F385

Drop column generation expression clause

X

F561

Full value expressions

X

F846

Octet support in regular expression operators

X

F847

Nonconstant regular expressions

X

F850

Top-level <order by clause> in <query expression>

O

F855

Nested <order by clause> in <query expression>

O

F856

Nested <fetch first clause> in <query expression>

O

F857

Top-level <fetch first clause> in <query expression>

O

F861

Top-level <result offset clause> in <query expression>

O

F863

Nested <result offset clause> in <query expression>

O

S091-03

Arrays expressions

X

S111

ONLY in query expressions

X

T121

WITH (excluding RECURSIVE) in query expression

O

T581

Regular expression substring function

X

Pseudo Columns

Pseudo column은 function과 유사하지만, pseudo column을 수행할 때 row 단위로 매번 다른 값을 반환할 수 있다는 점에서 table의 column과도 유사하다.

지원되는 pseudo column

이름

설명

참고

CURRVAL

Sequence와 관련있는 pseudo column이다.

CURRVAL

NEXTVAL

Sequence와 관련있는 pseudo column이다.

NEXTVAL

ROWNUM

조건을 만족하는 row의 번호이다.

ROWNUM

ROWID

데이터베이스 내의 레코드 식별자를 반환한다.

ROWID Pseudo Column

CLUSTER_GROUP_ID

레코드가 저장된 group의 식별자를 반환한다.

CLUSTER_GROUP_ID Pseudo Column

CLUSTER_MEMBER_ID

레코드가 저장된 member의 식별자를 반환한다.

CLUSTER_MEMBER_ID Pseudo Column

CLUSTER_GROUP_NAME

레코드가 저장된 group의 이름을 반환한다.

CLUSTER_GROUP_NAME Pseudo Column

CLUSTER_MEMBER_NAME

레코드가 저장된 member의 이름을 반환한다.

CLUSTER_MEMBER_NAME Pseudo Column

CLUSTER_SHARD_ID

레코드가 저장된 shard의 식별자를 반환한다.

CLUSTER_SHARD_ID Pseudo Column

ROWID Pseudo Column

ROWID pseudo column은 레코드 식별자로써 데이터베이스 내 각 레코드의 식별정보를 반환한다.
ROWID는 system에 따라 데이터베이스 내의 위치정보를 식별하기 위한 다음 정보들을 가진다.
Standalone system
• OBJECT_ID
• TABLESPACE_ID
• PAGE_ID
• PAGE 내 OFFSET
Cluster system
• GRID_BLOCK_SEQUENCE
• GRID_BLOCK_ID
• MEMBER_ID
• SHARD_ID
ROWID를 검색할 때 base 64 encoding으로 내부에 저장된 정보들을 A-Z, a-z, 0-9, +, / 의 value로 변환하여 출력한다.
ROWID 내에 저장된 데이터베이스 내 주소를 식별하기 위한 각각의 정보들은 ROWID-related functions 를 통해 얻을 수 있다.
레코드가 삭제되는 경우, 이 레코드의 주소는 새로 추가되는 레코드에 다시 할당될 수 있다.
ROWID pseudo column은 SELECT만 가능하고, INSERT, UPDATE, DELETE는 할 수 없다.
자세한 내용은 ROWID, ROWID-related Functions를 참조한다.
다음은 ROWID pseudo column을 검색하는 예이다.
gSQL> SELECT ROWID FROM T1;
                  ROWID
-----------------------
AAAAAAAAFpEAACAAAEAkAAA
AAAAAAAAFpEAACAAAEAkAAB
AAAAAAAAFpEAACAAAEAkAAC
AAAAAAAAFpEAACAAAEAkAAD
AAAAAAAAFpEAACAAAEAkAAE
5 rows selected.

CLUSTER_GROUP_ID Pseudo Column

CLUSTER_GROUP_ID pseudo column은 레코드 저장된 server의 group 식별자를 반환한다.
CLUSTER_GROUP_ID pseudo column은 SELECT만 가능하고, INSERT, UPDATE, DELETE는 할 수 없다.

Cluster system에서 유효한 정보이다.

다음은 CLUSTER_GROUP_ID pseudo column을 검색하는 예이다.

gSQL> SELECT T1.C1, T1.CLUSTER_GROUP_ID FROM T1;
C1 T1.CLUSTER_GROUP_ID
-- -------------------
A                    1
B                    2
C                    3

3 rows selected.

CLUSTER_MEMBER_ID Pseudo Column

CLUSTER_MEMBER_ID pseudo column은 레코드가 저장된 server의 member 식별자를 반환한다.
CLUSTER_MEMBER_ID pseudo column은 SELECT만 할 수 있고 INSERT, UPDATE, DELETE는 할 수 없다.

Cluster system에서 유효한 정보이다.

다음은 CLUSTER_MEMBER_ID pseudo column을 검색하는 예이다.

gSQL> SELECT T1.C1, T1.CLUSTER_MEMBER_ID FROM T1;
C1 T1.CLUSTER_MEMBER_ID
-- --------------------
A                     1
B                     3
C                     5

3 rows selected.

CLUSTER_GROUP_NAME Pseudo Column

CLUSTER_GROUP_NAME pseudo column은 레코드가 저장된 server의 group 이름을 반환한다.
CLUSTER_GROUP_NAME pseudo column은 SELECT만 할 수 있고 INSERT, UPDATE, DELETE는 할 수 없다.

Cluster system에서 유효한 정보이다.

다음은 CLUSTER_GROUP_NAME pseudo column을 검색하는 예이다.

gSQL> SELECT T1.C1, T1.CLUSTER_GROUP_NAME FROM T1;
C1 T1.CLUSTER_GROUP_NAME
-- ---------------------
A  G1                   
B  G2                   
C  G3                   

3 rows selected.

CLUSTER_MEMBER_NAME Pseudo Column

CLUSTER_MEMBER_NAME pseudo column은 레코드가 저장된 server의 member 이름을 반환한다.
CLUSTER_MEMBER_NAME pseudo column은 SELECT만 할 수 있고 INSERT, UPDATE, DELETE는 할 수 없다.

Cluster system에서 유효한 정보이다.

다음은 CLUSTER_MEMBER_NAME pseudo column을 검색하는 예이다.

gSQL> SELECT T1.C1, T1.CLUSTER_MEMBER_NAME FROM T1;
C1 T1.CLUSTER_MEMBER_NAME
-- ----------------------
A  G1N1                  
B  G2N1                  
C  G3N1                  

3 rows selected.

CLUSTER_SHARD_ID Pseudo Column

CLUSTER_SHARD_ID pseudo column은 레코드가 저장된 shard 식별자를 반환한다.
CLUSTER_SHARD_ID pseudo column은 SELECT만 할 수 있고 INSERT, UPDATE, DELETE는 할 수 없다.

Cluster system에서 유효한 정보이다.

다음은 CLUSTER_SHARD_ID pseudo column을 검색하는 예이다.

gSQL> SELECT T1.C1, T1.CLUSTER_SHARD_ID FROM T1;

C1 CLUSTER_SHARD_ID
-- ----------------
A                14
B                17
C                 4

3 rows selected.

호환성

Pseudo column에 대한 SQL 표준 호환성은 다음과 같다.

SQL 표준 호환성

Feature ID

설명

지원 여부

T176

Sequence generator support

O

T177

Sequence generator support: simple restart option

O

Operators

Operator는 구문상에서 하나 이상의 특정 기호 또는 keyword로 표현되며, 하나 이상의 argument들을 가지고 기능을 수행한다.
Operator에는 다음과 같이 다양한 형태가 있다.
• Arithmetic operator
• Concatenation operator
• Set operator

Arithmetic Operator

구문

<arithmetic operator> ::=
        <value term>
      | <expression> + <value term>
      | <expression> - <value term>

<value term> ::=
        <value factor>
      | <value term> * <value factor>
      | <value term> / <value factor>

<value factor> ::=
        <expression>
      | + <expression>
      | - <expression>

설명

Arithmetic operator는 숫자형, 날짜/ 시간, INTERVAL 타입의 산술 연산을 수행한다.
Arithmetic operator의 우선순위는 다음과 같다.
  1. + (POSITIVE), - (NEGATIVE)

  2. * (MULTIPLICATION), / (DIVISION)

  3. + (ADDITION), - (SUBTRACTION)

Concatenation Operator

구문

<concatenation operator> ::=
        <expression> || <expression>

설명

Concatenation operator는 CHARACTER STRING 타입이나 BINARY STRING 타입의 value 사이를 연결한 문자열을 반환한다.
자세한 내용은 || (CONCATENATE), CONCATENATE를 참조한다.

Set Operator

구문

<set operator> ::=
        <set operator term>
      | <subquery> UNION [ ALL | DISTINCT ] <set operator term>
      | <subquery> EXCEPT [ ALL | DISTINCT ] <set operator term>
      | <subquery> MINUS [ ALL | DISTINCT ] <set operator term>

<set operator term> ::=
        <subquery>
      | <subquery> INTERSECT [ ALL | DISTINCT ] <set operator term>

설명

set operator는 부질의 (subquery) 결과들에 대한 집합 (set) 연산을 수행한다.
INTERSECT ALL/ DISTINCT는 다른 set operator 보다 우선한다.
Set operators

Operator

설명

UNION ALL

Subquery 결과들에서 중복을 제거하지 않은 합집합이다.

UNION DISTINCT

Subquery 결과들에서 중복을 제거한 합집합이다.

EXCEPT ALL

Subquery 결과들에서 중복을 제거하지 않은 차집합이다.

EXCEPT DISTINCT

Subquery 결과들에서 중복을 제거한 차집합이다.

MINUS ALL

EXCEPT ALL과 동일하다.

MINUS DISTINCT

EXCEPT DISTINCT와 동일하다.

INTERSECT ALL

Subquery 결과들에서 중복을 제거하지 않은 교집합이다.

INTERSECT DISTINCT

Subquery 결과들에서 중복을 제거한 교집합이다.

호환성

Operator에 대한 SQL 표준 호환성은 다음과 같다.

SQL 표준 호환성

Feature ID

설명

지원 여부

E011-04

Arithmetic operators

O

E021-07

Character concatenation

O

E071-01

UNION DISTINCT table operator

O

E071-02

UNION ALL table operator

O

E071-03

EXCEPT DISTINCT table operator

O

E071-05

Columns combined via table operators need not have exactly the same data type

O

E071-06

Table operators in subqueries

O

F041-08

All comparison operators are supported (rather than just =)

O

F303

INTERSECT DISTINCT table operator

O

F305

INTERSECT ALL table operator

O

F304

EXCEPT ALL table operator

O

F846

Octet support in regular expression operators

X

J571

NEW operator

X

Functions

Operator와 기능상으로는 유사하지만, function은 이름 뒤에 괄호를 사용하여 argument들을 명시한다. 
Function은 0개 이상의 argument를 포함할 수 있다.
Function 형태는 다음과 같이 구분된다.
• Single row function
• Aggregate function

Single Row Function

Single row function은 table이나 view의 매 row 마다 각각 하나의 결과 row를 생성하는 function이다.

Single row function의 형태는 다음과 같이 구분된다.

Numeric Functions

Numeric function은 숫자형 값을 입력받아 숫자형 결과를 반환하는 function이다.

Numeric function의 종류는 다음과 같다.

Character String Functions Returning Character Values

Character string functions returning character values는 CHARACTER STRING형 값을 입력받아 CHARACTER STRING형 결과를 반환하는 function이다.

Character string functions returning character value의 종류는 다음과 같다.

Character String Functions Returning Number Values

Character string functions returning number value는 CHARACTER STRING형 값을 입력받아 숫자형 결과를 반환하는 function이다.

Character string functions returning number value의 종류는 다음과 같다.

Datetime Functions

Datetime function은 DATE/ TIME/ TIMESTAMP/ INTERVAL 형 값을 입력받아 DATE/ TIME/ TIMESTAMP/ INTERVAL형 결과를 반환하는 function이다.

Datetime function의 종류는 다음과 같다.

General Comparison Functions

General comparison function은 value 집합에 대한 최소값 또는 최대값을 구하는 function이다.

General comparison function의 종류는 다음과 같다.

Conversion Functions

Conversion function은 특정 data type으로의 값을 설정하는 function이다.

Conversion function 종류는 다음과 같다.

Conditional Functions

Conditional function은 조건에 따라 특정값을 결과로 반환하는 function이다.

Conditional function의 종류는 다음과 같다.

NULL-related Functions

NULL-related function은 입력값이 NULL값인지 여부에 따라 특정값을 결과로 반환하는 function이다.

NULL-related function의 종류는 다음과 같다.

ROWID-related Functions

ROWID-related function은 ROWID에 대한 정보를 얻기 위한 function이다.

ROWID-related function의 종류는 다음과 같다.

Encryption Functions

Encryption function은 주어진 plain text를 특정 알고리즘으로 encrypt/ decrypt 하거나 hash한 결과값을 반환하는 function이다.

Encryption function의 종류는 다음과 같다.

System Information Functions

System information function은 session과 system에 대한 정보를 얻기 위한 function이다.

System information function의 종류는 다음과 같다.

Statistics Information function

Statistics information function은 object에 대한 정보를 조회하는 function 이다.

Statistics information function의 종류는 다음과 같다.

Aggregate Function

Aggregate function은 여러 row에 대해 하나의 결과 row를 생성하는 function이다.

Aggregation function의 종류는 다음과 같다.

Window Function

정의된 레코드 범위에 대한 function의 결과를 반환하는 함수이다.

정의된 레코드 범위를 window 라고 하며, OVER <window name or specification>에 수행 범위를 정의한다.

Window에 대한 자세한 내용은 window clause를 참조한다.

그룹 내 각각의 레코드는 window (정의된 레코드 범위)에 대해 window function을 수행한 결과를 갖는다. 따라서 window function은 aggregate function과 달리 각 그룹에 대해 여러 개의 레코드를 반환한다.

Window function은 select list와 order by clause에 기술할 수 있다.

Window function의 종류는 다음과 같다.

호환성

Function에 대한 SQL 표준 호환성은 다음과 같다.

SQL 표준 호환성

Feature ID

설명

지원 여부

B033

Untyped SQL-invoked function arguments

X

E021-04

CHARACTER_LENGTH function

O

E021-05

OCTET_LENGTH function

O

E021-06

SUBSTRING function

O

E021-08

UPPER and LOWER functions

O

E021-09

TRIM function

O

E021-11

POSITION function

O

E091-01

AVG

O

E091-02

COUNT

O

E091-03

MAX

O

E091-04

MIN

O

E091-05

SUM

O

E091-06

ALL quantifier

O

E091-07

DISTINCT quantifier

O

F131-03

Set functions supported in queries with grouped views

O

F201

CAST function

O

F441

Extended set function support

O

F442

Mixed column references in set functions

X

F801

Full set function

X

F842

OCCURRENCES_REGEX function

X

F843

POSITION_REGEX function

X

S071

SQL paths in function and type name resolution

X

S201-02

Array as result type of functions

X

S211

User-defined cast functions

X

S241

Transform functions

X

T041-03

POSITION, LENGTH, LOWER, TRIM, UPPER, and SUBSTRING functions for LOB data types

X

T312

OVERLAY function

O

T321-01

User-defined functions with no overloading

O

T326

Table functions

X

T341

Overloading of SQL-invoked functions and SQL-invoked procedures

X

T433

Multiargument GROUPING function

X

T441

ABS and MOD functions

O

T571

Array-returning external SQL-invoked functions

X

T572

Multiset-returning external SQL-invoked functions

X

T581

Regular expression substring function

X

T614

NTILE function

O

T615

LEAD and LAG functions

O

T616

Null treatment option for LEAD and LAG functions

O

T617

FIRST_VALUE and LAST_VALUE functions

O

T618

NTH_VALUE function

O

T619

Nested window functions

X

T621

Enhanced numeric functions

O

Conditions

Condition

TRUE, FALSE, UNKNOWN으로 평가되는 식이다.

Condition이 사용될 수 있는 SQL 구문의 위치는 다음과 같다.

• DELETE, UPDATE의 WHERE 절
• SELECT의 WHERE, HAVING 절
• 그 외 BOOLEAN TYPE이 위치할 수 있는 곳
Condition의 종류는 다음과 같다.

• Comparison condition
• Logical condition
• Null condition
• Compound condition
• Pattern-matching condition
• Between condition
• In condition
• Exists condition
• Distinct condition
Condition 우선순위

우선순위

Condition 종류

1

조건절에 쓰여진 연산자들

2

=, !=, <, >, <=, >=

3

IS [NOT] NULL,

[NOT] BETWEEN,

[NOT] IN,

LIKE, EXISTS,

IS [NOT] DISTINCT FROM

4

NOT

5

AND

6

OR

Comparison Conditions

양쪽 조건을 비교하여 TRUE, FALSE, UNKNOWN 값의 boolean 타입을 반환한다.
Comparison condition

Condition

설명

=

두 식이 같은지 여부를 검사한다.

!=, <>

두 식이 서로 같지 않은지 여부를 검사한다.

>

두 식을 비교하여 큰 지 여부를 검사한다.

<

두 식을 비교하여 작은 지 여부를 검사한다.

>=

두 식을 비교하여 크거나 같은지 검사한다.

<=

두 식을 비교하여 작거나 같은지 검사한다.

ANY, SOME

왼쪽 expr이 오른쪽 expr_list (또는 subquery 결과) 중 하나 이상을 만족하는 조건이면 TRUE를 반환한다.

오른쪽 subquery의 결과가 없는 경우, FALSE를 반환한다.

ALL

왼쪽 expr이 오른쪽 expr_list (또는 subquery 결과)를 모두 만족하는 조건이면 TRUE를 반환한다.

오른쪽 subquery의 결과가 없는 경우, TRUE를 반환한다.

자세한 내용은 타입간 비교를 참조한다.

< Simple Comparison Conditions >

구문

<simple_comparison_condition> ::=
        <expr>          <comparison_operator> <expr>
      | <expr>          <comparison_operator> ( <subquery> )
      | ( <subquery> )  <comparison_operator> <expr>
      | ( <subquery> )  <comparison_operator> ( <subquery> ) 
      | ( <expr_list> ) <comparison_operator> ( <expr_list> )
      | ( <expr_list> ) <comparison_operator> ( <subquery> )
      | ( <subquery> )  <comparison_operator> ( <expr_list> )
      | ( <subquery> )  <comparison_operator> ( <subquery> )

<comparison_operator> ::=
        <  =   >
      | <  !=  >
      | <  <   >
      | <  >   >
      | <  <=  >
      | <  >=  >

<expr_list> ::= 
        <expr>
      | <expr>, ... , <expr>
      | ( <expr> )
      | ( <expr> , ... , <expr> )
자세한 내용은 Scalar Subquery Expression을 참조한다.

설명

comparison_operator 양쪽에 expr_list 또는 subquery가 오는 경우, 비교되는 expr의 개수 또는 subquery target의 개수는 동일해야 한다.
Subquery가 오는 경우, 결과 레코드는 한 건이어야 한다.

사용 예

Simple comparison condition의 예

Condition

결과

'abc' = 'abc'

TRUE

'abc' != 'abc'

FALSE

'abc' < 'abc'

FALSE

'abc' <= 'abc'

TRUE

'abc' > 'abc'

FALSE

'abc' >= 'abc'

TRUE

( 1, 2, 3 ) = ( 1, 2, 3 )

TRUE

( 1, 2, 3 ) = ( 1, 2, 4 )

FALSE

( 1, 2, 3 ) != ( 4, 5, 6 )

TRUE

( 1, 2, 3 ) != ( 1, 2, 3 )

FALSE

( 1, 2, 3 ) < ( 1, 2, 4 )

TRUE

( 1, 2, 3 ) < ( 1, 2, 3 )

FALSE

( 1, 2, 3 ) <= ( 1, 2, 4 )

TRUE

( 1, 2, 3 ) <= ( 1, 2, 2 )

FALSE

( 1, 2, 3 ) > ( 1, 2, 2 )

TRUE

( 1, 2, 3 ) > ( 1, 2, 4 )

FALSE

( 1, 2, 3 ) >= ( 1, 2, 2 )

TRUE

( 1, 2, 3 ) >= ( 1, 2, 4 )

FALSE

< Group Comparison Conditions >

구문

<group_comparison_condition> ::=
   <expr>          <comparison_operator> <quantifier> ( <expr_list> )
 | <expr>          <comparison_operator> <quantifier> ( <subquery> )
 | ( <expr_list> ) <comparison_operator> <quantifier> ( <expr_list_list> )
 | ( <expr_list> ) <comparison_operator> <quantifier> ( <subquery> )
 | ( <subquery> )  <comparison_operator> <quantifier> ( <expr_list> )
 | ( <subquery> )  <comparison_operator> <quantifier> ( <expr_list_list> )
 | ( <subquery> )  <comparison_operator> <quantifier> ( <subquery> )

<comparison_operator> ::=
        <  =   >
      | <  !=  >
      | <  <   >
      | <  >   >
      | <  <=  >
      | <  >=  >

<quantifier> ::=
        ALL
      | ANY
      | SOME

<expr_list> ::= 
        <expr>
      | <expr>, ... , <expr>
      | ( <expr> )
      | ( <expr> , ... , <expr> )

<expr_list_list> ::=
        <expr_list>
      | <expr_list>, ... , <expr_list>
자세한 내용은 Scalar Subquery Expression을 참조한다.

설명

comparison_operator 양쪽에 expr_list 또는 subquery가 오는 경우, 비교되는 expr의 개수 또는 subquery target의 개수는 동일해야 한다.
comparison_operator 왼쪽에 subquery가 오는 경우, 결과 레코드는 한 건이어야 한다.
comparison_operator 오른쪽에 subquery가 오는 경우, 결과 레코드는 여러 건일 수 있다.

사용 예

Group comparison condition의 예

Condition

결과

1 =any ( 1, 2, 3, 4, 5 )

TRUE

1 =any ( 1, 2, null, 4, 5 )

TRUE

1 =any ( 2, null, 4, 5 )

NULL

1 =any ( 100, 2, 3, 4, 5 )

FALSE

1 =all ( 1, +1, 1E+0 )

TRUE

1 =all ( 1, +1, 1E+0, null )

NULL

1 =all ( 1, 2, 3, 4, 5 )

FALSE

( 1, 2 ) =any ( ( 0, 1 ), ( 1, 2 ), ( 3, 4 ) )

TRUE

( 1, 2 ) =any ( ( 0, 1 ), ( 1, 2 ), ( null, null ) )

TRUE

( 1, 2 ) =any ( ( 0, 1 ), ( 2, 3 ), ( 3, 4 ) )

FALSE

( 1, 2 ) =all ( ( 1, 2 ), ( +1, +2 ), ( 1E+0, 2E+0 ) )

TRUE

( 1, 2 ) =all ( ( 1, 2 ), ( +1, +2 ), ( null, null ) )

NULL

( 1, 2 ) =all ( ( 0, 1 ), ( 2, 3 ), ( 3, 4 ) )

FALSE

comparison_operator 오른쪽 subquery의 결과 레코드가 0인 경우

( 'X' ) =any ( select dummy from dual where dummy = 'Y' )

FALSE

( 'X' ) =all ( select dummy from dual where dummy = 'Y' )

TRUE

Logical Conditions

Logical condition으로는 AND, OR, NOT이 있다.

AND

구문

<boolean value expression> AND <boolean value expression>

설명

AND boolean operator의 truth table

AND

True

False

Unknown

True

True

False

Unknown

False

False

False

False

Unknown

Unknown

False

Unknown

OR

구문

<boolean value expression> OR <boolean value expression>

설명

OR boolean operator의 truth table

OR

True

False

Unknown

True

True

True

True

False

True

False

Unknown

Unknown

True

Unknown

Unknown

NOT

구문

NOT <boolean value expression>

설명

NOT boolean operator의 truth table

expr

NOT

True

False

False

True

Unknown

Unknown

Null Condition

구문

<expr> IS [NOT] NULL

설명

expr의 결과가 NULL 값인지 여부를 검사한다.
Is Null 조건의 결과표

expr

IS NULL

IS NOT NULL

NULL

True

False

NOT NULL

False

True

Compound Condition

여러 조건들이 결합되어 만들어진 조건식이다.

compound_condition ::=
        ( condition )
      | NOT condition
      | condition < AND | OR > condition

Pattern-matching Conditions

LIKE Condition

구문

like_condition ::=
        string [NOT] LIKE pattern [ ESCAPE escape_character ]

설명

string이 지정된 pattern과 일치하는지 검사한다.
인자 string, pattern, escape_charater에는 CHARACTER, CHARACTER VARYING, CHARACTER LONG VARYING과 같은 문자 타입 또는 문자 타입으로 변환될 수 있는 타입이 올 수 있다.
string, pattern, escape_character가 NULL인 경우,  NULL이 결과로써 반환된다.
escape_character가 생략되었을 경우, default 값은 없다.
escape_character가 명시된 경우, escape_character는 한 개 문자여야 한다.
pattern에 '_' 또는 '%'를 포함하지 않으면, equal 연산 (string = pattern)과 동일하게 처리된다.
pattern에 '_' 또는 '%'이 포함되면, string에서 다음과 같이 일치여부를 판단한다.
• '_': 임의의 한 개 문자와 대응한다.
• '%': 0개 이상의 문자를 가진 임의의 문자열과 대응한다.
pattern에 포함된 '_' 또는 '%'를 문자로 비교하고자 하는 경우, ESCAPE 절을 사용한다.
escape_character를 지정하고, 지정된 escape_character를 pattern의 '_' 또는 '%' 앞에 기술한다.

사용 예

gSQL> SELECT 'hello%' LIKE 'h%o!%' ESCAPE '!' AS RESULT FROM DUAL;
RESULT
------
TRUE

• 'represent' LIKE 'represent'   => TRUE
• 'represent' LIKE ' represent ' => FALSE
• 'represent' LIKE 'REPRESENT'   => FALSE
• 'represent' LIKE 'r_pr_s_nt'   => TRUE
• 'represent' LIKE 're%t'        => TRUE
• 'represent' LIKE 'rep'         => FALSE

• 'summer_vacation' LIKE 'summer\_vacation' ESCAPE '\'  => TRUE
• NULL LIKE 'summer\_vacation' ESCAPE '\'               => NULL
• 'summer_vacation' LIKE NULL ESCAPE '\'                => NULL
• 'summer_vacation' LIKE 'summer\_vacation' ESCAPE NULL => NULL

REGEXP_LIKE Condition

구문

regexp_like_condition ::=
        REGEXP_LIKE ( source_string, pattern[, match_param ] )

설명

source_string 이 지정된 pattern 과 match 되는지 검사한다.
source_string
검색 대상 문자 표현식으로, CHARACTER, CHARACTER VARYING, CHARACTER LONG VARYING과 같은 문자 타입 또는 문자 타입으로 변환될 수 있는 타입이 올 수 있다.
pattern
regular expression (정규 표현식)으로, CHARACTER, CHARACTER VARYING, CHARACTER LONG VARYING과 같은 문자 타입 또는 문자 타입으로 변환될 수 있는 타입이 올 수 있다.
512 byte까지 기술할 수 있다.
pattern 에서 지정할 수 있는 operator는 Regular Expression 을 참조한다.
match_param
function 의 기본 matching 수행 동작을 변경할 수 있는 문자 표현식으로, CHARACTER, CHARACTER VARYING, CHARACTER LONG VARYING과 같은 문자 타입이 올 수 있다.
match_param 에는 'i', 'c', 'n', 'm', 'x' 를 지정할 수 있으며, 하나 이상 기술할 수 있다.
'i'

대소문자를 구별하지 않는다. ( case-insensitive )

'c'

대소문자를 구별한다. ( case-sensitive )

'n'

Dot operator ( . ) 가 newline character 와의 match 를 허용한다.

'm'

source_string 을 multiple line 으로 처리한다. 각각의 line 에 대해 ^ ( Beginning-of-Line Anchor ) 와 $ ( End-of-Line Anchor ) 를 해석한다.

'x'

pattern 내의 whitespace 를 무시한다.

match_param 에 'i', 'c', 'n', 'm', 'x' 이외의 문자가 오는 경우 에러를 반환한다.
match_param 에 'ic' 와 같이 모순되는 대소문자 매칭이 나열되었을 경우는 에러를 반환한다.
match_param 을 생략했을 경우,
 • 대소문자를 구별한다. ( case-sensitive )
 • Dot operator(.) 가 newline character 와의 match 를 허용하지 않는다.
 • source_string 을  single line 으로 처리한다.

사용 예

gSQL> 
SELECT web_street_name FROM web_site;
WEB_STREET_NAME
---------------
Dogwood Sunset 
7th            
2nd 3rd        
Hill 5th       
Cedar North    
5 rows selected.

gSQL> 
SELECT *
  FROM web_site
 WHERE REGEXP_LIKE( web_street_name, '[[:digit:]]th$' );
WEB_STREET_NAME
---------------
7th            
Hill 5th       
2 rows selected.

BETWEEN Condition

구문

<between condition> ::=
   <expr1> [ NOT ] BETWEEN [ ASYMMETRIC | SYMMETRIC ] <expr2> AND <expr3>

설명

expr1이 expr2와 expr3 범위 내의 조건인지 검사한다.
ASYMMETRIC이나 SYMMETRIC이 생략된 경우, default는 ASYMMETRIC 이다.
expr1, expr2, expr3의 data type이 다른 경우, conversion이 수행된다.
자세한 내용은 타입간 비교, 타입간 변환을 참조한다.
Between 구문 동치

A

B

X BETWEEN ASYMMETRIC Y AND Z

X BETWEEN Y AND Z

X BETWEEN Y AND Z

X >= Y AND X <= Z

X NOT BETWEEN Y AND Z

NOT( X BETWEEN Y AND Z )

X BETWEEN SYMMETRIC Y AND Z

((X BETWEEN Y AND Z) OR (X BETWEEN Z AND Y)

X NOT BETWEEN SYMMETRIC Y AND Z

NOT( X BETWEEN SYMMETRIC Y AND Z )

사용 예

Between 구문의 예

Condition

결과

BETWEEN [ ASYMMETRIC ]

3 BETWEEN 1 AND 5

TRUE

NULL BETWEEN 1 AND 5

3 BETWEEN NULL AND 5

3 BETWEEN 1 AND NULL

NULL

3 BETWEEN 5 AND 1

FALSE

BETWEEN SYMMETRIC

3 BETWEEN SYMMETRIC 1 AND 5

TRUE

NULL BETWEEN SYMMETRIC 1 AND 5

3 BETWEEN SYMMETRIC NULL AND 5

3 BETWEEN SYMMETRIC 1 AND NULL

NULL

3 BETWEEN SYMMETRIC 5 AND 1

TRUE

IN Condition

구문

<in_condition> ::=
        <expr>          [NOT] IN ( <expr_list> )  
      | <expr>          [NOT] IN ( <subquery> )  
      | ( <expr_list> ) [NOT] IN ( <expr_list_list> )  
      | ( <expr_list> ) [NOT] IN ( <subquery> )
      | ( <subquery> )  [NOT] IN ( <expr_list> )  
      | ( <subquery> )  [NOT] IN ( <expr_list_list> )  
      | ( <subquery> )  [NOT] IN ( <subquery> )  

<expr_list> ::=          
        <expr>       
      | <expr>, ... , <expr>       
      | ( <expr> )       
      | ( <expr> , ... , <expr> )  

<expr_list_list> ::=         
        <expr_list>       
      | <expr_list>, ... , <expr_list>

설명

IN condition은 =ANY와 동일한 결과를 반환한다.
NOT IN condition은 !=ALL과 동일한 결과를 반환한다.
자세한 내용은 Comparison Conditions를 참조한다.

사용 예

IN condition의 예

Condition

결과

1 IN ( 1, 2, 3, 4, 5 )

TRUE

1 IN ( 1, 2, null, 4, 5 )

TRUE

1 IN ( 2, null, 4, 5 )

NULL

1 IN ( 100, 2, 3, 4, 5 )

FALSE

NULL IN ( 1, 2, 3 )

NULL

1 NOT IN ( 2, 3, 4, 5 )

TRUE

1 NOT IN ( 2, null, 4, 5 )

NULL

1 NOT IN ( 1, 2, null, 4, 5 )

FALSE

1 NOT IN ( 100, 2, 3, 4, 5 )

TRUE

NULL NOT IN ( 1, 2, 3 )

NULL

EXISTS Condition

구문

exists_conditions ::= 
        EXISTS ( subquery )

설명

Subquery의 결과 레코드 존재 유무를 검사한다. 
Subquery의 결과 레코드가 존재하면 TRUE를 반환하고, 결과 레코드가 존재하지 않으면 FALSE를 반환한다.

사용 예

gSQL> SELECT * FROM DUAL WHERE EXISTS ( SELECT * FROM DUAL );
      DUMMY
      -----
      X    
      1 row selected.

gSQL> SELECT * FROM DUAL 
       WHERE EXISTS ( SELECT * FROM DUAL WHERE DUMMY = 'Y' );
      no rows selected.

DISTINCT Condition

구문

distinct_conditions ::= 
        <expr> IS [NOT] DISTINCT FROM <expr>
      | ( <expr_list> ) IS [NOT] DISTINCT FROM ( <expr_list> )

설명

Distinct condition의 피연산자는 서로 비교 가능한 타입이어야 한다.
피연산자로 <expr_list>가 오는 경우, 같은 position의 데이터가 비교 대상이 된다.
Distinct condition의 피연산자로 모두 not null value가 오는 경우,
is distinct from 은 not equal(!=) 과 같고 
is not distinct from 은 eqaul(=) 과 같은 결과를 반환한다.
Distinct condition은 NULL value를 unknown이 아닌 일반 데이터로 처리한다는 점이 다른 비교 연산자와의 차이점이다.

사용 예

* IS DISTINCT FROM

gSQL>
SELECT i1,
       i2,
       i1 IS DISTINCT FROM i2 AS IsDistinct
  FROM t1; 

  I1   I2 ISDISTINCT
---- ---- ----------
   1 null TRUE      
   1    1 FALSE     
   1    2 TRUE      
null null FALSE     
null    1 TRUE      
null    2 TRUE      

6 rows selected.

gSQL>
SELECT i1,
       i2,
       i3,
       ( I1, I2, I3 ) IS DISTINCT FROM ( 1, 1, 1 ) AS RESULT 
  FROM t1;

  I1   I2   I3 RESULT
---- ---- ---- ------
   1    1    1 FALSE 
   2 null    3 TRUE  
null null null TRUE  

3 rows selected.


* IS NOT DISTINCT FROM

gSQL>
SELECT i1,
       i2,
       i1 IS NOT DISTINCT FROM i2 AS IsNotDistinct 
  FROM t1; 

  I1   I2 ISNOTDISTINCT
---- ---- -------------
   1 null FALSE        
   1    1 TRUE         
   1    2 FALSE        
null null TRUE         
null    1 FALSE        
null    2 FALSE        

6 rows selected.

gSQL> 
SELECT i1,
       i2,
       i3,
       ( I1, I2, I3 ) IS NOT DISTINCT FROM ( 1, 1, 1 ) AS RESULT
 FROM t1;

  I1   I2   I3 RESULT
---- ---- ---- ------
   1    1    1 TRUE  
   2 null    3 FALSE 
null null null FALSE 

3 rows selected.

호환성

Condition에 대한 SQL 표준 호환성은 다음과 같다.

SQL 표준 호환성

Feature ID

설명

지원 여부

E061-01

Comparison predicate

O

E061-02

BETWEEN predicate

O

E061-03

IN predicate with list of values

O

E061-04

LIKE predicate

O

E061-05

LIKE predicate: ESCAPE clause

O

E061-06

NULL predicate

O

E061-07

Quantified comparison predicate

O

E061-08

EXISTS predicate

O

E061-09

Subqueries in comparison predicate

O

E061-11

Subqueries in IN predicate

O

E061-12

Subqueries in quantified comparison predicate

O

E061-13

Correlated subqueries

O

E061-14

Search condition

O

F051-04

Comparison predicate on DATE, TIME, and TIMESTAMP data types

X

F053

OVERLAPS predicate

X

F263

Comma-separated predicates in simple CASE expression

X

F291

UNIQUE predicate

X

F481

Expanded NULL predicate

O

F841

LIKE_REGEX predicate

X

P008

Comma-separated predicates in a CASE statement Extended CASE

X

S151

Type predicate

X

T141

SIMILAR predicate

X

T151

DISTINCT predicate

X

T152

DISTINCT predicate with negation

X

T461

Symmetric BETWEEN predicate

O

T501

Enhanced EXISTS predicate

O

T631

IN predicate with one list element

X

X090

XML document predicate

X

X091

XML content predicate

X

X141

IS VALID predicate: data-driven case

X

X142

IS VALID predicate: ACCORDING TO clause

X

X143

IS VALID predicate: ELEMENT clause

X

X144

IS VALID predicate: schema location

X

X145

IS VALID predicate outside check constraints

X

X151

IS VALID predicate with DOCUMENT option

X

X152

IS VALID predicate with CONTENT option

X

X153

IS VALID predicate with SEQUENCE option

X

X155

IS VALID predicate: NAMESPACE without ELEMENT clause

X

X157

IS VALID predicate: NO NAMESPACE with ELEMENT clause

X

Regular Expression

Regular Expression 은 메타문자 (operators)와 문자 리터럴을 사용하여 검색 패턴을 지정한다.

July (fourth|4(th)?)

Regular Expressions

Regular Expression Matching Options

Regular Expression matching 수행 동작을 지정하는 option의 종류는 다음과 같다.

* i : case-insensitive matching

gSQL>
SELECT REGEXP_COUNT( 'Superscript digits', 's', 1, 'i' ) AS RESULT
  FROM dual;
RESULT
------
     3
1 row selected.
* c : case-sensitive matching

gSQL> 
SELECT REGEXP_COUNT( 'Superscript digits', 's', 1, 'c' ) AS RESULT
  FROM dual;
RESULT
------
     2
1 row selected.
* n : Dot operator(.) 가 newline character 와의 match 허용

gSQL> 
SELECT * FROM t1;
C1               
-----------------
matching options:
i, c, n, m, x    
1 row selected.

gSQL> 
SELECT REGEXP_SUBSTR( c1, ':.+', 1, 1, 'n' ) AS RESULT
  FROM t1;
RESULT       
-------------
:            
i, c, n, m, x
1 row selected.
* m : 문자열 내부의 newline character를 행을 종료하는 multiline mode 로 지정

gSQL> 
SELECT * FROM t1;
C1               
-----------------
matching options:
i, c, n, m, x    
1 row selected.

gSQL> 
SELECT REGEXP_COUNT( c1, '^.+', 1, 'm' ) AS RESULT
  FROM t1;
RESULT
------
     2
1 row selected.

gSQL> 
SELECT REGEXP_SUBSTR( c1, '^.+', 1, 1, 'm' ) AS RESULT1,
       REGEXP_SUBSTR( c1, '^.+', 1, 2, 'm' ) AS RESULT2
  FROM t1;
RESULT1           RESULT2      
----------------- -------------
matching options: i, c, n, m, x
1 row selected.
* x : regular expression 내의 whitespace 를 무시한다.

gSQL> 
SELECT REGEXP_SUBSTR('MATCHING', 'M A T C H I N G', 1, 1, 'x') AS RESULT
  FROM dual;
RESULT  
--------
MATCHING
1 row selected.

Regular Expression Operators

Operator 는 데이터베이스 문자셋의 데이터를 처리하고, 멀티바이트 문자도 일치 항목에 포함한다.
Regular Expression Operators

Operator

설명

\

escape character

\ 다음 문자를 문자 literal 로 다룬다.

  • operator 를 문자로 검색할 수 있다.

    • 예: \+ ( + 를 문자로 검색한다. )

    • 예: \\ ( \ 를 문자로 검색한다. )

.

하나의 문자와 match 된다.

*

0 개 이상 ( zero or more ) match 된다. (greedy)

+

하나 이상 ( one or more ) match 된다. (greedy)

?

0 또는 1 개 ( zero or one ) match 된다. (greedy)

|

Alternation: 여러식 중 하나와 match 된다.

^

  • Default mode: 문자열의 시작과 match 된다.

    • 예: abc\ndef 는 정규표현식 ^. 에 a 가 match 된다.

  • Multi line mode ( matching option 'm' ): 문자열 내 모든 행의 시작과 match 된다.

    • 예: abc\ndef 는 정규표현식 ^. 에 a, d 가 match 된다.

$

  • Default mode: 문자열의 끝 또는 문자열 끝의 \n 바로 앞 문자와 match 된다.

    • 예: abc\ndef, abc\ndef\n 은 정규표현식 .$ 에 모두 f 가 match 된다.

  • Multi line mode ( matching option 'm' ): 문자열내 모든 행의 끝과 match 된다.

    • 예: abc\ndef 는 정규표현식 .$ 에 c, f 가 match 된다.

[ ]

[ ] 내의 문자리스트들 중 하나와 match 된다.

  • [ ] 내 문자리스트에는 single character, - (range), [: :] (character class) 을 나열할 수 있다.

    • 예: REGEXP_SUBSTR( 'aB9', '[aA-Z[:digit:]]*' ) ==> aB9

  • - (range) 에 기술된 문자는 unicode 의 binary code 로 비교된다.

  • - (range), [: :] (character class) 을 제외하고 모두 literal 로 해석한다.

  • ] (right bracket) 문자를 문자리스트에 포함하고자 하는 경우, 문자리스트의 첫번째로 기술한다.

    • 예: REGEXP_SUBSTR( ']', '[]Bracket]' ) ==> ]

  • - ( hyphen ) 문자를 문자리스트에 포함하고자 하는 경우, 문자리스트의 첫번째 또는 마지막에 기술한다.

    • 예: REGEXP_SUBSTR( '-', '[-Bracket]' ) ==> -

    • 예: REGEXP_SUBSTR( '-', '[Bracket-]' ) ==> -

[^ ]

[ ] 내의 문자리스트들에 존재하지 않는 문자와 match 된다.

  • [ ] 내 문자리스트에는 single character, - (range), [: :] (character class) 을 나열할 수 있다.

    • 예: REGEXP_SUBSTR( 'aB9', '[^aA-Z[:digit:]]*' ) ==> NULL

  • - (range) 에 기술된 문자는 unicode 의 binary code 로 비교된다.

  • - (range), [: :] (character class) 를 제외하고 모두 literal 로 해석한다.

  • ] (right bracket) 문자를 문자리스트에 포함하고자 하는 경우, ^ 다음에 기술한다.

    • 예: REGEXP_SUBSTR( ']', '[^]Bracket]' ) ==> NULL

  • - ( hyphen ) 문자를 문자리스트에 포함하고자 하는 경우, ^ 다음에 기술하거나, 문자리스트 마지막에 기술한다.

    • 예: REGEXP_SUBSTR( '-', '[^-Bracket]' ) ==> NULL

    • 예: REGEXP_SUBSTR( '-', '[^Bracket-]' ) ==> NULL

( )

( ) 안의 expression 을 하나의 subexpression 그룹으로 다룬다.

subexpression 은 subexpression 에 포함될 수 있다.

subexpression의 여는 괄호 '(' 를 시작으로 왼쪽에서 오른쪽으로 subexpression 을 count 한다.

  • (abc)((12(345))67(89))

    • 1: abc

    • 2: 123456789

    • 3: 12345

    • 4: 345

    • 5: 89

{m}

m 번 match 된다.

{m,}

최소 m 번 이상 match 된다. (greedy)

{m,n}

최소 m 번 이상 최대 n 번까지 match 된다. (greedy)

\n

Back Reference

Back Reference 이전에 정의된 n 번째 subexpression 과 match 된다.

n 은 1 ~ 9 까지의 정수이다.

Back Reference 는 각 subexpression 의 여는 괄호 '(' 를 시작으로 왼쪽에서 오른쪽으로 subexpression 을 count 한다.

[: :]

character class 에 속하는 문자와 match 된다.

  • [:alnum:] : 알파벳과 숫자

  • [:alpha:] : 알파벳

  • [:blank:] : 공백과 탭

  • [:cntrl:] : 제어문자

  • [:digit:] : 숫자

  • [:graph:] : space 를 제외한 printable characters

  • [:lower:] : 소문자

  • [:print:] : space 를 포함한 printable characters

  • [:punct:] : 특수문자

  • [:space:] : white space

  • [:upper:] : 대문자

  • [:xdigit:] : 16 진수 숫자

\d

digit character 와 match 된다.

[[:digit:]] 과 동일하다.

\D

digit character 가 아닌 문자와 match 된다.

[^[:digit:]] 과 동일하다.

\w

alphanumeric, underscore 문자와 match 된다.

[[:alnum:]_] 와 동일하다.

\W

word character 가 아닌 문자와 match 된다.

[^[:alnum:]_] 와 동일하다.

\s

whitespace character 와 match 된다.

[[:space:]] 와 동일하다.

\S

whitespace character 가 아닌 문자와 match 된다.

[^[:space:]] 와 동일하다.

\A

문자열의 시작과 match 된다.

\Z

문자열의 끝 또는 문자열 끝의 \n 바로 앞 문자와 match 된다.

예: abc\ndef, abc\ndef\n 은 정규표현식 .\Z 에 모두 f 가 match 된다.

\z

문자열의 끝과 match 된다.

*?

0 번이상 ( zero or more ) match 된다. (nongreedy)

+?

1 번이상 ( one or more ) match 된다. (nongreedy)

??

0 또는 1 번 ( zero or one ) match 된다. (nongreedy)

{m}?

m 번 match 된다. (nongreedy)

{m,}?

최소 m 번 이상 match 된다. (nongreedy)

{m,n}?

최소 m 번 이상 최대 n 번 이하로 match 된다. (nongreedy)

### 예:

gSQL> 
SELECT REGEXP_SUBSTR( 'axxxbxbxb', 'a\w+b' ) AS RES_GREEDY,
       REGEXP_SUBSTR( 'axxxbxbxb', 'a\w+?b' ) AS RES_NON_GREEDY
  FROM dual;
RES_GREEDY RES_NON_GREEDY
---------- --------------
axxxbxbxb  axxxb         
1 row selected.

다음은 각각의 regular expression operator를 사용한 예이다.

• \

gSQL> 
SELECT REGEXP_SUBSTR( '(a)\1', '\(a\)\\1' ) AS RESULT FROM dual;
RESULT
------
(a)\1 
1 row selected.
•.

gSQL> SELECT REGEXP_SUBSTR( 'abcde', 'a...e' ) AS RESULT FROM dual;
RESULT
------
abcde 
1 row selected.
• *, +, ?

gSQL> 
SELECT REGEXP_SUBSTR( 'ab', 'ax*b' ) AS RESULT1,
       REGEXP_SUBSTR( 'axb', 'ax*b' ) AS RESULT2,
       REGEXP_SUBSTR( 'axxxb', 'ax*b' ) AS RESULT3
  FROM dual;
RESULT1 RESULT2 RESULT3
------- ------- -------
ab      axb     axxxb  
1 row selected.

gSQL> 
SELECT REGEXP_SUBSTR( 'ab', 'ax+b' ) AS RESULT1,
       REGEXP_SUBSTR( 'axb', 'ax+b' ) AS RESULT2,
       REGEXP_SUBSTR( 'axxxb', 'ax+b' ) AS RESULT3
  FROM dual;
RESULT1 RESULT2 RESULT3
------- ------- -------
null    axb     axxxb  
1 row selected.

gSQL> 
SELECT REGEXP_SUBSTR( 'ab', 'ax?b' ) AS RESULT1,
       REGEXP_SUBSTR( 'axb', 'ax?b' ) AS RESULT2,
       REGEXP_SUBSTR( 'axxxb', 'ax?b' ) AS RESULT3
  FROM dual;
RESULT1 RESULT2 RESULT3
------- ------- -------
ab      axb     null   
1 row selected.
• |

gSQL> 
SELECT REGEXP_SUBSTR( 'Regexp', '(R|r)egexp' ) AS RESULT1,
       REGEXP_SUBSTR( 'regexp', '(R|r)egexp' ) AS RESULT2
 FROM dual;
RESULT1 RESULT2
------- -------
Regexp  regexp 
1 row selected.
• ^, $

gSQL> 
SELECT * FROM t1;
C1             
---------------
Line1 : aaa xy1
Line2 : bbb xy2
Line3 : ccc xy3
1 row selected.

gSQL> 
SELECT REGEXP_COUNT( c1, '^Line[[:digit:]]' ) AS RESULT_DEFAULT_MODE,
       REGEXP_COUNT( c1, '^Line[[:digit:]]', 1, 'm' ) AS RESULT_MULTILINE_MODE
  FROM t1;
RESULT_DEFAULT_MODE RESULT_MULTILINE_MODE
------------------- ---------------------
                  1                     3
1 row selected.

gSQL> 
SELECT REGEXP_SUBSTR( c1, '^Line[[:digit:]]', 1 ) AS RES_DEFAULT,
       REGEXP_SUBSTR( c1, '^Line[[:digit:]]', 1, 1, 'm' ) AS RES_MULTILINE_1,
       REGEXP_SUBSTR( c1, '^Line[[:digit:]]', 1, 2, 'm' ) AS RES_MULTILINE_2,
       REGEXP_SUBSTR( c1, '^Line[[:digit:]]', 1, 3, 'm' ) AS RES_MULTILINE_3
  FROM t1;
RES_DEFAULT RES_MULTILINE_1 RES_MULTILINE_2 RES_MULTILINE_3
----------- --------------- --------------- ---------------
Line1       Line1           Line2           Line3          
1 row selected.


gSQL> 
SELECT REGEXP_COUNT( c1, 'xy[[:digit:]]$' ) AS RESULT_DEFAULT_MODE,
       REGEXP_COUNT( c1, 'xy[[:digit:]]$', 1, 'm' ) AS RESULT_MULTILINE_MODE
  FROM t1;
RESULT_DEFAULT_MODE RESULT_MULTILINE_MODE
------------------- ---------------------
                  1                     3
1 row selected.

gSQL> 
SELECT REGEXP_SUBSTR( c1, 'xy[[:digit:]]$', 1 ) AS RES_DEFAULT,
       REGEXP_SUBSTR( c1, 'xy[[:digit:]]$', 1, 1, 'm' ) AS RES_MULTILINE_1,
       REGEXP_SUBSTR( c1, 'xy[[:digit:]]$', 1, 2, 'm' ) AS RES_MULTILINE_2,
       REGEXP_SUBSTR( c1, 'xy[[:digit:]]$', 1, 3, 'm' ) AS RES_MULTILINE_3
  FROM t1;
RES_DEFAULT RES_MULTILINE_1 RES_MULTILINE_2 RES_MULTILINE_3
----------- --------------- --------------- ---------------
xy3         xy1             xy2             xy3            
1 row selected.
• [ ], [^ ]

gSQL> 
SELECT REGEXP_SUBSTR( 'a', '[abc]' ) AS RESULT1,
       REGEXP_SUBSTR( 'A', '[A-Z]' ) AS RESULT2,
       REGEXP_SUBSTR( '1', '[[:digit:]]' ) AS RESULT3,
       REGEXP_SUBSTR( 'abAB12', '[abcA-Z[:digit:]]+' ) AS RESULT
  FROM dual;
RESULT1 RESULT2 RESULT3 RESULT
------- ------- ------- ------
a       A       1       abAB12
1 row selected.

gSQL> 
SELECT REGEXP_SUBSTR( 'x', '[^abc]' ) AS RESULT1,
       REGEXP_SUBSTR( 'y', '[^A-Z]' ) AS RESULT2,
       REGEXP_SUBSTR( 'z', '[^[:digit:]]' ) AS RESULT3,
       REGEXP_SUBSTR( 'xyz', '[^abcA-Z[:digit:]]+' ) AS RESULT
  FROM dual;
RESULT1 RESULT2 RESULT3 RESULT
------- ------- ------- ------
x       y       z       xyz   
1 row selected.
• ( ), \n

gSQL> 
SELECT REGEXP_SUBSTR( 'abcbcabc', 'a(bc)\1a\1' ) AS RESULT1,
       REGEXP_SUBSTR( 'abcbcabc', '(a)(b)(c)\2\3\1\2\3' ) AS RESULT2,
       REGEXP_SUBSTR( 'abcbcabc', '(a(bc))\2\1' ) AS RESULT3
 FROM dual;
RESULT1  RESULT2  RESULT3 
-------- -------- --------
abcbcabc abcbcabc abcbcabc
1 row selected.
• {m}, {m,}, {m,n}

gSQL> 
SELECT REGEXP_SUBSTR( 'axxb', 'ax{3}b' ) AS RESULT1,
       REGEXP_SUBSTR( 'axxxb', 'ax{3}b' ) AS RESULT2,
       REGEXP_SUBSTR( 'axxxxxb', 'ax{3}b' ) AS RESULT3
  FROM dual;
RESULT1 RESULT2 RESULT3
------- ------- -------
null    axxxb   null   
1 row selected.

gSQL> 
SELECT REGEXP_SUBSTR( 'axxb', 'ax{3,}b' ) AS RESULT1,
       REGEXP_SUBSTR( 'axxxb', 'ax{3,}b' ) AS RESULT2,
       REGEXP_SUBSTR( 'axxxxxb', 'ax{3,}b' ) AS RESULT3
  FROM dual;
RESULT1 RESULT2 RESULT3
------- ------- -------
null    axxxb   axxxxxb
1 row selected.

gSQL> 
SELECT REGEXP_SUBSTR( 'axxb', 'ax{3,5}b' ) AS RESULT1,
       REGEXP_SUBSTR( 'axxxb', 'ax{3,5}b' ) AS RESULT2,
       REGEXP_SUBSTR( 'axxxxxb', 'ax{3,5}b' ) AS RESULT3,
       REGEXP_SUBSTR( 'axxxxxxxb', 'ax{3,5}b' ) AS RESULT4
  FROM dual;
RESULT1 RESULT2 RESULT3 RESULT4
------- ------- ------- -------
null    axxxb   axxxxxb null   
1 row selected.
• [: :]

gSQL> 
SELECT REGEXP_SUBSTR( 'abc123', '[[:alnum:]]+' ) AS RESULT1,
       REGEXP_SUBSTR( 'abc', '[[:alpha:]]+' ) AS RESULT2,
       REGEXP_SUBSTR( '123', '[[:digit:]]+' ) AS RESULT3
  FROM dual;
RESULT1 RESULT2 RESULT3
------- ------- -------
abc123  abc     123    
1 row selected.
• \d, \D, \w, \W, \s, \S

gSQL> 
SELECT REGEXP_SUBSTR( '123', '\d+' ) AS RESULT1,
       REGEXP_SUBSTR( 'abc', '\D+' ) AS RESULT2
  FROM dual;
RESULT1 RESULT2
------- -------
123     abc    
1 row selected.

gSQL> 
SELECT REGEXP_SUBSTR( 'A_B_C', '\w+' ) AS RESULT1,
       REGEXP_SUBSTR( '+ @', '\W+' ) AS RESULT2
  FROM dual;
RESULT1 RESULT2
------- -------
A_B_C   + @    
1 row selected.

gSQL> 
SELECT REGEXP_SUBSTR( 'a   d', 'a\s+d' ) AS RESULT1,
       REGEXP_SUBSTR( 'abc d', '\S+' ) AS RESULT2
  FROM dual;
RESULT1 RESULT2
------- -------
a   d   abc    
1 row selected.
• \A

gSQL> 
select * from t1;
C1             
---------------
Line1 : aaa xy1
Line2 : bbb xy2
Line3 : ccc xy3
1 row selected.

gSQL> 
SELECT REGEXP_COUNT( c1, '\ALine[[:digit:]]' ) AS RESULT_DEFAULT_MODE,
       REGEXP_COUNT( c1, '\ALine[[:digit:]]', 1, 'm' ) AS RESULT_MULTILINE_MODE
  FROM t1;
RESULT_DEFAULT_MODE RESULT_MULTILINE_MODE
------------------- ---------------------
                  1                     1
1 row selected.

gSQL> 
SELECT REGEXP_SUBSTR( c1, '\ALine[[:digit:]]' ) AS RESULT_DEFAULT_MODE,
       REGEXP_SUBSTR( c1, '\ALine[[:digit:]]', 1, 1, 'm' ) AS RESULT_MULTILINE_MODE
  FROM t1;
RESULT_DEFAULT_MODE RESULT_MULTILINE_MODE
------------------- ---------------------
Line1               Line1                
1 row selected.
• \Z

gSQL> 
SELECT c1 FROM t1;
C1 
---
abc    <-- 첫번째 레코드 abc\ndef 
def
abc    <-- 두번째 레코드 abc\ndef\n
def
   
2 rows selected.

gSQL> 
SELECT REGEXP_SUBSTR( c1, '.\Z' ) AS REGEXP_SUBSTR_RES 
  FROM t1;
REGEXP_SUBSTR_RES
-----------------
f                
f                
2 rows selected.
• \z

gSQL> 
SELECT * FROM t1;
C1             
---------------
Line1 : aaa xy1
Line2 : bbb xy2
Line3 : ccc xy3
1 row selected.

gSQL> 
SELECT REGEXP_COUNT( c1, '\w+\d\z' ) AS RESULT_DEFAULT_MODE,
       REGEXP_COUNT( c1, '\w+\d\z', 1, 'm' ) AS RESULT_MULTILINE_MODE
  FROM t1;
RESULT_DEFAULT_MODE RESULT_MULTILINE_MODE
------------------- ---------------------
                  1                     1
1 row selected.

gSQL> 
SELECT REGEXP_SUBSTR( c1, '\w+\d\z' ) AS RESULT_DEFAULT_MODE,
       REGEXP_SUBSTR( c1, '\w+\d\z', 1, 1, 'm' ) AS RESULT_MULTILINE_MODE
  FROM t1;
RESULT_DEFAULT_MODE RESULT_MULTILINE_MODE
------------------- ---------------------
xy3                 xy3                  
1 row selected.
• *?, +?, ??

gSQL> 
SELECT REGEXP_SUBSTR( 'ab', 'a\w*?b' ) AS RESULT1,
       REGEXP_SUBSTR( 'axxxbxb', 'a\w*?b' ) AS RESULT2
  FROM dual;
RESULT1 RESULT2
------- -------
ab      axxxb  
1 row selected.


gSQL> 
SELECT REGEXP_SUBSTR( 'ab', 'a\w+?b' ) AS RESULT1,
       REGEXP_SUBSTR( 'axxxbxb', 'a\w+?b' ) AS RESULT2
  FROM dual;
RESULT1 RESULT2
------- -------
null    axxxb  
1 row selected.

gSQL> 
SELECT REGEXP_SUBSTR( 'ab', 'a\w??b' ) AS RESULT1,
       REGEXP_SUBSTR( 'axbxb', 'a\w??b' ) AS RESULT2,
       REGEXP_SUBSTR( 'axxxbxb', 'a\w?b' ) AS RESULT3
  FROM dual;
RESULT1 RESULT2 RESULT3
------- ------- -------
ab      axb     null   
1 row selected.
• {n}?, {n,}?, {n,m}?

gSQL> 
SELECT REGEXP_SUBSTR( 'abxb', 'a\w{3}?b' ) AS RESULT1,
       REGEXP_SUBSTR( 'axxxbxbxb', 'a\w{3}?b' ) AS RESULT2,
       REGEXP_SUBSTR( 'axxxxxbxbxb', 'a\w{3}?b' ) AS RESULT3
  FROM dual;
RESULT1 RESULT2 RESULT3
------- ------- -------
null    axxxb   null   
1 row selected.

gSQL> 
SELECT REGEXP_SUBSTR( 'abxb', 'a\w{3,}?b' ) AS RESULT1,
       REGEXP_SUBSTR( 'axxxbxb', 'a\w{3,}?b' ) AS RESULT2,
       REGEXP_SUBSTR( 'axxxxxbxbxb', 'a\w{3,}?b' ) AS RESULT3
  FROM dual;
RESULT1 RESULT2 RESULT3
------- ------- -------
null    axxxb   axxxxxb
1 row selected.

gSQL> 
SELECT REGEXP_SUBSTR( 'abxb', 'a\w{3,5}?b' ) AS RESULT1,
       REGEXP_SUBSTR( 'axxxbxb', 'a\w{3,5}?b' ) AS RESULT2,
       REGEXP_SUBSTR( 'axxxxxbxbxb', 'a\w{3,5}?b' ) AS RESULT3,
       REGEXP_SUBSTR( 'axxxxxxxbxbxb', 'a\w{3,5}?b' ) AS RESULT4
  FROM dual;
RESULT1 RESULT2 RESULT3 RESULT4
------- ------- ------- -------
null    axxxb   axxxxxb null   
1 row selected.

JSON String Constructor

JSON string constructor는 SQL expression을 인자로 받아 JSON 형식의 문자열을 생성하는 함수이다.

JSON string constructor는 다음과 같이 구분된다.
• JSON value constructor
• JSON aggregate constructor
• JSON window constructor

JSON String Constructor

JSON value Constructor

JSON value constructor는 매 row 마다 하나의 JSON 문자열 row를 생성하는 single row function이다.

JSON value constructor의 종류는 다음과 같다.

JSON aggregate Constructor

JSON aggregate constructor는 결과를 집계하여 하나의 JSON 문자열 row를 생성하는 aggregate function이다.

JSON aggregate constructor의 종류는 다음과 같다.

JSON window Constructor

JSON window constructor는 OVER 절을 이용하여 정의된 레코드 범위에 대한 JSON 문자열을 생성하는 window 함수이다.

window 내 그룹에 따라 결과 row의 수가 결정된다는 점에서 aggregate function과 차이가 있다.

JSON window constructor의 종류는 다음과 같다.

JSON 문자열

JSON 문자열에는 JSON object 문자열과 JSON array 문자열, 두 가지 유형이 있다.

JSON Object 문자열

JSON object 문자열은 연속된 key-value 쌍을 중괄호로 묶는 방식으로 구성되는데, 이 때 key는 SQL 문자열이어야 한다.

{ key : value }
{ key : value, key : value, ... }

JSON object 문자열을 결과로 도출하는 함수는 다음 세 가지 함수이다.

JSON Array 문자열

JSON array 문자열은 연속된 value를 대괄호로 묶는 방식으로 구성되어 있다.

[ value ]
[ value, value, ... ]

JSON array 문자열을 결과로 도출하는 함수는 다음 세 가지 함수이다.

JSON Structural Characters

JSON string을 구성하는 character에는 여섯 가지 종류가 있다.

JSON structural character

설명

[

JSON array 문자열을 시작할 때 사용하는 대괄호이다.

]

JSON array 문자열을 닫을 때 사용하는 대괄호이다.

{

JSON object 문자열을 시작할 때 사용하는 중괄호이다.

}

JSON object 문자열을 닫을 때 사용하는 중괄호이다.

:

key를 구분하는 문자이다.

,

value를 구분하는 문자이다.

이 문자들은 앞뒤 공백을 허용한다.

JSON Escape Characters

JSON 문자열 내에서 escape 되는 문자는 다음과 같다.

문자

escape 형태

설명

"

\"

quotation mark

\

\\

back slash

CHR(8)

\b

backspace

CHR(12)

\f

form feed

CHR(10)

\n

new line feed

CHR(19)

\r

carriage return

CHR(9)

\t

tab

다음은 문자가 escape 되는 예이다.

gSQL> SELECT JSON_OBJECT( 'quote' VALUE '"',
                          'backslash' VALUE '\',
                          'backspace' VALUE CHR(8),
                          'formfeed' VALUE CHR(12),
                          'newline' VALUE CHR(10),
                          'carriage_return' VALUE CHR(13),
                          'tab' VALUE CHR(9) ) AS escaped_json
       FROM dual;

ESCAPED_JSON                                                                    
-------------------------------------------------------------------------
{"quote":"\"","backslash":"\\","backspace":"\b","formfeed":"\f","newline":"\n","carriage_return":"\r","tab":"\t"}                                   

1 row selected.

다음은 escape 되지 않은 문자열과 escape 된 문자열을 비교하는 예이다.

--# escape 되지 않은 결과
SELECT * FROM sample_table;

ID STRING_DATA             
-- ------------------------
 1 simple string           
 2 This is first sentence. 
   This is second sentence.
 3 He said, "Hello".       

3 rows selected.


--# escape 된 결과
SELECT JSON_OBJECT( 'ID'    VALUE id,
                    'DATA'  VALUE string_data ) AS json_string
  FROM sample_table;

JSON_STRING                                                        
-------------------------------------------------------------------
{"ID":1,"DATA":"simple string"}                                    
{"ID":2,"DATA":"This is first sentence.\nThis is second sentence."}
{"ID":3,"DATA":"He said, \"Hello\"."}                              

3 rows selected.

JSON Result Control Options

JSON Constructor Null Clause

JSON string constructor의 인자 value가 null 일 때 출력되는 결과를 제어할 수 있다.

<JSON constructor null clause> ::=
    NULL ON NULL
  | ABSENT ON NULL
  | EMPTY STRING ON NULL

NULL ON NULL

Value가 null 인 경우, JSON string null을 출력한다.

gSQL> SELECT JSON_OBJECT( name VALUE balances NULL ON NULL ) AS res_json_object
        FROM accounts;

RES_JSON_OBJECT
---------------
{"Alice":50000}
{"Bob":null}   
{"Chris":1000} 

3 rows selected.

gSQL> SELECT JSON_ARRAY( name, balances NULL ON NULL ) AS res_json_array
        FROM accounts;

RES_JSON_ARRAY 
---------------
["Alice",50000]
["Bob",null]   
["Chris",1000] 

3 rows selected.

ABSENT ON NULL

Value가 null 인 경우, 이를 무시하고 아무것도 출력하지 않는다.

gSQL> SELECT JSON_OBJECT( name VALUE balances ABSENT ON NULL ) AS res_json_object
        FROM accounts;

RES_JSON_OBJECT
---------------
{"Alice":50000}
{}             
{"Chris":1000} 

3 rows selected.

gSQL> SELECT JSON_ARRAY( name, balances ABSENT ON NULL ) AS res_json_array
        FROM accounts; 

RES_JSON_ARRAY 
---------------
["Alice",50000]
["Bob"]        
["Chris",1000] 

3 rows selected.

EMPTY STRING ON NULL

Value가 null 인 경우, empty string ("")을 출력한다.

gSQL> SELECT JSON_OBJECT( name VALUE balances EMPTY STRING ON NULL ) AS res_json_object
        FROM accounts;

RES_JSON_OBJECT
---------------
{"Alice":50000}
{"Bob":""}     
{"Chris":1000} 

3 rows selected.

gSQL> SELECT JSON_ARRAY( name, balances EMPTY STRING ON NULL ) AS res_json_array
        FROM accounts;

RES_JSON_ARRAY 
---------------
["Alice",50000]
["Bob",""]     
["Chris",1000] 

3 rows selected.

JSON Key Uniqueness Constraint

JSON object key field의 중복 허용 여부를 설정할 수 있다.

<JSON key uniqueness constraint> ::=
    WITH UNIQUE [ KEYS ]
  | WITHOUT UNIQUE [ KEYS ]

WITH UNIQUE [ KEYS ]

하나의 JSON object 내에서 key가 중복될 수 없다. 만약 중복된 경우에는 에러를 반환한다.

CREATE TABLE t1 ( key1 VARCHAR(3), data1 VARCHAR(3) );
INSERT INTO t1 VALUES ( 'K1', 'D1' );
INSERT INTO t1 VALUES ( 'K2', 'D2' );
INSERT INTO t1 VALUES ( 'K1', 'D3' );
COMMIT;

gSQL> SELECT JSON_OBJECTAGG( key1 VALUE data1 WITH UNIQUE KEYS ) AS result 
        FROM t1;

ERR-42000(13065): duplicate key names 'K1' in JSON object

WITHOUT UNIQUE [ KEYS ]

하나의 JSON object 내에서 중복된 key를 허용한다.

gSQL> SELECT JSON_OBJECTAGG( key1 VALUE data1 WITHOUT UNIQUE KEYS ) AS result
      FROM t1;

RESULT                         
-------------------------------
{"K1":"D1","K2":"D2","K1":"D3"}

1 row selected.

JSON Array Aggregate Order By Clause

ORDER BY 절에 지정된 sort specification list의 순서에 따라 value를 정렬한 후 JSON_ARRAYAGG 결과를 생성한다.

<JSON array aggregate order by clause> ::=
    ORDER BY <sort specification list>

<sort specification list> ::=
    <sort specification> [ { <comma> <sort specification> }... ]

<sort specification> ::=
    <sort key> [ <ordering specification> ] [ <null ordering> ]

<sort key> ::=
    <value expression>

<ordering specification> ::=
      ASC
    | DESC

<null ordering> ::=
      NULLS FIRST
    | NULLS LAST

다음은 JSON array aggregate order by clause를 사용하여 JSON array value를 정렬하는 예이다.

CREATE TABLE t1 ( c1 int );
INSERT INTO t1 VALUES (3),(1),(null),(2);

gSQL> SELECT JSON_ARRAYAGG( c1 ) AS res_json_sort
       FROM t1;

RES_JSON_SORT
-------------
[3,1,2]     

gSQL> SELECT JSON_ARRAYAGG( c1 ORDER BY c1 ) AS res_json_sort
       FROM t1;

RES_JSON_SORT
-------------
[1,2,3]
gSQL> SELECT JSON_ARRAYAGG( c1 ORDER BY c1 ASC ) AS res_json_sort
        FROM t1;

RES_JSON_SORT
-------------
[1,2,3]                            

1 row selected.

gSQL> SELECT JSON_ARRAYAGG( c1 ORDER BY c1 DESC ) AS res_json_sort
        FROM t1;

RES_JSON_SORT
-------------
[3,2,1]                             

1 row selected.
gSQL> SELECT JSON_ARRAYAGG( c1 ORDER BY c1 NULL ON NULL ) AS res_json_sort
        FROM t1;

RES_JSON_SORT
-------------
[1,2,3,null]                                

1 row selected.

gSQL> SELECT JSON_ARRAYAGG( c1 ORDER BY c1 NULLS FIRST NULL ON NULL ) AS res_json_sort
        FROM t1;

RES_JSON_SORT
-------------
[null,1,2,3]                                            

1 row selected.

gSQL> SELECT JSON_ARRAYAGG( c1 ORDER BY c1 NULLS LAST NULL ON NULL ) AS res_json_sort
        FROM t1;

RES_JSON_SORT
-------------
[1,2,3,null]                                           

1 row selected.

JSON Output Clause

JSON string constructor로 생성된 문자열의 결과 타입과 출력 형식을 제어할 수 있다.

<JSON output clause> ::=
    RETURNING <string data type> [PRETTY]

<string data type> ::=
    CHAR(n)
  | VARCHAR(n)
  | LONG VARCHAR

다음은 JSON output clause를 명시하여 결과 data type를 지정하는 예이다.

gSQL> SELECT JSON_OBJECT( name VALUE balances RETURNING VARCHAR(100) ) AS res_json_object
        FROM accounts;

RES_JSON_OBJECT
---------------
{"Alice":50000}
{"Bob":null}   
{"Chris":1000} 

3 rows selected.

위 예시에 PRETTY 옵션을 적용한 결과는 다음과 같다.

gSQL> SELECT JSON_OBJECT( name VALUE balances RETURNING VARCHAR(100) PRETTY ) AS res_json_object
        FROM accounts;

RES_JSON_OBJECT  
-----------------
{                
    "Alice":50000
}                
{                
    "Bob":null   
}                
{                
    "Chris":1000 
}                

3 rows selected.

JSON 문자열 출력 형식

JSON string constructor가 생성하는 문자열은 인자 expression의 SQL data type에 따라 다음과 같이 출력된다.

expression의 SQL data type

결과 출력 형식

숫자

Numeric

Boolean

Boolean

Character String

String

Binary String

String

날짜/시간

String

Interval

String

각 인자 expression의 SQL data type에 따른 결과 JSON 문자열의 출력 형식은 다음과 같다.

숫자

숫자 타입은 numeric에서 표현 가능한 모든 유효숫자를 표현할 수 있다.

gSQL> SELECT JSON_OBJECT( 'k_num' VALUE 100 ) AS result
        FROM dual;

RESULT       
-------------
{"k_num":100}

1 row selected.

gSQL> SELECT JSON_ARRAY( 100 ) AS result
        FROM dual;

RESULT
------
[100] 

1 row selected.

Boolean

gSQL> SELECT JSON_OBJECT( 'k_boolean' VALUE true ) AS result
        FROM dual;

RESULT            
------------------
{"k_boolean":true}

1 row selected.

gSQL> SELECT JSON_ARRAY( true ) AS result
        FROM dual;

RESULT
------
[true]

1 row selected.

Character String

gSQL> SELECT JSON_OBJECT( 'k_char' VALUE 'hello' ) AS result
        FROM dual;

RESULT            
------------------
{"k_char":"hello"}

1 row selected.

gSQL> SELECT JSON_ARRAY( 'hello' ) AS result
        FROM dual; 

RESULT   
---------
["hello"]

1 row selected.

Binary String

Binary string은 16진수 문자열로 표현된다.

gSQL> SELECT JSON_OBJECT( 'k_binary' VALUE X'0011FF' ) AS result
        FROM dual;

RESULT               
---------------------
{"k_binary":"0011FF"}

1 row selected.

gSQL> SELECT JSON_ARRAY( X'0011FF' ) AS result
        FROM dual; 

RESULT    
----------
["0011FF"]

1 row selected.

날짜/ 시간

날짜

날짜 타입은 'YYYY-MM-DDTHH:MM:SS' 형식으로 출력된다.

gSQL> SELECT JSON_OBJECT( 'k_date' VALUE DATE '2025-05-05' ) AS result
        FROM dual;

RESULT                          
--------------------------------
{"k_date":"2025-05-05T00:00:00"}

1 row selected.

gSQL> SELECT JSON_ARRAY( DATE '2025-05-05' ) AS result
        FROM dual;

RESULT                 
-----------------------
["2025-05-05T00:00:00"]

1 row selected.

시간

시간 타입은 'HH:MM:SS.FF6' 형식으로 출력된다.

gSQL> SELECT JSON_OBJECT( 'k_time' VALUE TIME '15:30:59.999999' ) AS result
        FROM dual;

RESULT                      
----------------------------
{"k_time":"15:30:59.999999"}

1 row selected.

gSQL> SELECT JSON_ARRAY( TIME'15:30:59.999999' ) AS result
        FROM dual; 

RESULT             
-------------------
["15:30:59.999999"]

1 row selected.

Timestamp

Timestamp 타입은 'YYYY-MM-DDTHH:MM:SS.FF6' 형식으로 출력된다.

gSQL> SELECT JSON_OBJECT( 'k_timestamp' VALUE TIMESTAMP '2025-05-05 12:30:45 +09:00' ) AS result
        FROM dual;

RESULT                                            
--------------------------------------------------
{"k_timestamp":"2025-05-05T12:30:45.000000+09:00"}

1 row selected.

gSQL> SELECT JSON_ARRAY( TIMESTAMP '2025-05-05 12:30:45 +09:00' ) AS result
        FROM dual;

RESULT                              
------------------------------------
["2025-05-05T12:30:45.000000+09:00"]

1 row selected.

Interval

Interval 타입은 ISO 8601에 정의된 duration format으로 표현된다.

Interval Year to Month

Interval Year to Month 타입은 'P[n]Y[n]M' 구조로 출력된다.

gSQL> SELECT JSON_OBJECT( 'k_int_ytom' VALUE INTERVAL '3-6' YEAR TO MONTH ) AS result
        FROM dual; 

RESULT                
----------------------
{"k_int_ytom":"P3Y6M"}

1 row selected.

gSQL> SELECT JSON_ARRAY( INTERVAL '3-6' YEAR TO MONTH ) AS result
        FROM dual; 

RESULT   
---------
["P3Y6M"]

1 row selected.

gSQL> SELECT JSON_OBJECT( 'k_int_ytom' VALUE INTERVAL '0-6' YEAR TO MONTH ) AS result
        FROM dual; 

RESULT              
--------------------
{"k_int_ytom":"P6M"}

1 row selected.

gSQL> SELECT JSON_ARRAY( INTERVAL '0-6' YEAR TO MONTH ) AS result
        FROM dual; 

RESULT 
-------
["P6M"]

1 row selected.

gSQL> SELECT JSON_OBJECT( 'k_int_ytom' VALUE INTERVAL '0-0' YEAR TO MONTH ) AS result
        FROM dual;

RESULT              
--------------------
{"k_int_ytom":"P0Y"}

1 row selected.

gSQL> SELECT JSON_ARRAY( INTERVAL '0-0' YEAR TO MONTH ) AS result
        FROM dual; 

RESULT 
-------
["P0Y"]

1 row selected.

Interval Day to Second

Interval Day to Second 타입은 'P[n]DT[n]H[n]M[n]S' 구조로 출력된다.

gSQL> SELECT JSON_OBJECT( 'k_int_dtos' VALUE INTERVAL '1 2:30:15.123' DAY TO SECOND ) AS result
        FROM dual;

RESULT                              
------------------------------------
{"k_int_dtos":"P1DT2H30M15.123000S"}

1 row selected.


gSQL> SELECT JSON_ARRAY( INTERVAL '1 2:30:15.123' DAY TO SECOND ) AS result
        FROM dual;

RESULT                 
-----------------------
["P1DT2H30M15.123000S"]

1 row selected.

gSQL> SELECT JSON_OBJECT( 'k_int_dtos' VALUE INTERVAL '0 00:30:00' DAY TO SECOND ) AS result
        FROM dual;

RESULT                
----------------------
{"k_int_dtos":"PT30M"}

1 row selected.

gSQL> SELECT JSON_ARRAY( INTERVAL '0 00:30:00' DAY TO SECOND ) AS result
        FROM dual;

RESULT   
---------
["PT30M"]

1 row selected.

gSQL> SELECT JSON_OBJECT( 'k_int_dtos' VALUE INTERVAL '0 00:00:00' DAY TO SECOND ) AS result
        FROM dual;

RESULT              
--------------------
{"k_int_dtos":"P0D"}

1 row selected.

gSQL> SELECT JSON_ARRAY( INTERVAL '0 00:00:00' DAY TO SECOND ) AS result
        FROM dual;

RESULT 
-------
["P0D"]

1 row selected.

호환성

JSON string constructor에 대한 SQL 표준 호환성은 다음과 같다.

SQL 표준 호환성

Feature ID

설명

지원 여부

T811

Basic SQL/JSON constructor functions

O

T812

SQL/JSON: JSON_OBJECTAGG

O

T813

SQL/JSON: JSON_ARRAYAGG with ORDER BY

O

T814

Colon in JSON_OBJECT or JSON_OBJECTAGG

O

T830

Enforcing unique keys in SQL/JSON constructor functions

O