리터럴
리터럴
리터럴(literal, 상수라고도 함)은 고정된 데이터 값을 나타내요. Spark SQL은 다음 리터럴들을 지원해요.
문자열 리터럴
문자열 리터럴은 문자 문자열 값을 지정하는 데 사용해요.
문법
`[ r ] { 'char [ ... ]' | "char [ ... ]" } [ ... ]
매개변수
- char
문자 집합의 한 문자. 특수 문자를 이스케이프하려면 \를 사용해요(예: ' 또는 \). 유니코드 문자를 표현하려면 \uxxxx 또는 \Uxxxxxxxx 형태의 16비트 또는 32비트 유니코드 이스케이프를 사용해요. 여기서 xxxx와 xxxxxxxx는 각각 16비트와 32비트 코드 포인트를 16진수로 나타낸 것이에요(예: あ는 \u3042, 👍는 \U0001F44D). ASCII 문자는 \ 앞에 8진수를 붙여서 나타낼 수도 있는데, 예를 들어 \101은 A를 나타내요.
- r
대소문자를 구분하지 않으며 RAW를 나타내요. 문자열 리터럴이 r 접두사로 시작하면 특수 문자도 유니코드 문자도 \로 이스케이프되지 않아요.
일반 문자열 리터럴(r 접두사 없음)에서는 다음 이스케이프 시퀀스가 인식되고, 다음 규칙에 따라 치환돼요.
\0->\u0000, 코드 0인 유니코드 문자;\b->\u0008, 백스페이스;\n->\u000a, 줄바꿈(linefeed);\r->\u000d, 캐리지 리턴;\t->\u0009, 가로 탭;\Z->\u001A, 치환(substitute);\%->\%;\_->\_;\<다른 문자>-><다른 문자>, 슬래시를 건너뛰고 문자를 그대로 둠.
위 이스케이프 해제 규칙은 SQL 설정 spark.sql.parser.escapedStringLiterals를 true로 설정하면 끌 수 있어요.
문자열 리터럴의 연속 체인은 하나의 문자열 리터럴로 합쳐져요(coalesce). 이는 한 줄에 다 들어가기 너무 긴 문자열을 만들 때 유용해요. 또한 문자열 리터럴과 매개변수 마커를 하나의 문자열 리터럴로 섞는 것도 허용해요.
예시
SELECT 'Hello, World!' AS col;
+-------------+
| col|
+-------------+
|Hello, World!|
+-------------+
SELECT "SPARK SQL" AS col;
+---------+
| col|
+---------+
|SPARK SQL|
+---------+
SELECT 'it\'s $10.' AS col;
+---------+
| col|
+---------+
|it's $10.|
+---------+
SELECT r"'\n' represents newline character." AS col;
+----------------------------------+
| col|
+----------------------------------+
|'\n' represents newline character.|
+----------------------------------+
SELECT 'Hello' ',' 'World!' AS col;
+-------------+
| col|
+-------------+
|Hello, World!|
+-------------+
EXECUTE IMMEDIATE 'SELECT "Hello, " :p "!" AS col' USING 'World' AS p;
+-------------+
| col|
+-------------+
|Hello, World!|
+-------------+
이진 리터럴
이진 리터럴은 바이트 시퀀스 값을 지정하는 데 사용해요.
문법
`X { 'num [ ... ]' | "num [ ... ]" }
매개변수
- num
0부터 F까지의 모든 16진수.
예시
SELECT X'123456' AS col;
+----------+
| col|
+----------+
|[12 34 56]|
+----------+
NULL 리터럴
NULL 리터럴은 null 값을 지정하는 데 사용해요.
문법
`NULL
예시
SELECT NULL AS col;
+----+
| col|
+----+
|NULL|
+----+
불리언 리터럴
불리언 리터럴은 불리언 값을 지정하는 데 사용해요.
문법
`TRUE | FALSE
예시
SELECT TRUE AS col;
+----+
| col|
+----+
|true|
+----+
숫자 리터럴
숫자 리터럴은 고정 소수점 숫자나 부동 소수점 숫자를 지정하는 데 사용해요. 숫자 리터럴에는 정수 리터럴(integral literal)과 분수 리터럴(fractional literal) 두 종류가 있어요.
정수 리터럴 문법
`[ + | - ] digit [ ... ] [ L | S | Y ]
정수 리터럴 매개변수
- digit
0부터 9까지의 모든 숫자.
- L
대소문자를 구분하지 않으며, 8바이트 부호 있는 정수인 BIGINT를 나타내요.
- S
대소문자를 구분하지 않으며, 2바이트 부호 있는 정수인 SMALLINT를 나타내요.
- Y
대소문자를 구분하지 않으며, 1바이트 부호 있는 정수인 TINYINT를 나타내요.
- 기본(접미사 없음)
4바이트 부호 있는 정수를 나타내요.
정수 리터럴 예시
SELECT -2147483648 AS col;
+-----------+
| col|
+-----------+
|-2147483648|
+-----------+
SELECT 9223372036854775807l AS col;
+-------------------+
| col|
+-------------------+
|9223372036854775807|
+-------------------+
SELECT -32Y AS col;
+---+
|col|
+---+
|-32|
+---+
SELECT 482S AS col;
+---+
|col|
+---+
|482|
+---+
분수 리터럴 문법
decimal 리터럴:
`decimal_digits { [ BD ] | [ exponent BD ] } | digit [ ... ] [ exponent ] BD
double 리터럴:
`decimal_digits { D | exponent [ D ] } | digit [ ... ] { exponent [ D ] | [ exponent ] D }
float 리터럴:
`decimal_digits { F | exponent [ F ] } | digit [ ... ] { exponent [ F ] | [ exponent ] F }
여기서 decimal_digits는 다음과 같이 정의되고,
`[ + | - ] { digit [ ... ] . [ digit [ ... ] ] | . digit [ ... ] }
exponent는 다음과 같이 정의돼요.
`E [ + | - ] digit [ ... ]
분수 리터럴 매개변수
- digit
0부터 9까지의 모든 숫자.
- D
대소문자를 구분하지 않으며, 8바이트 배정밀도 부동 소수점 숫자인 DOUBLE을 나타내요.
- F
대소문자를 구분하지 않으며, 4바이트 단정밀도 부동 소수점 숫자인 FLOAT을 나타내요.
- BD
대소문자를 구분하지 않으며, 전체 자릿수가 precision이고 소수점 오른쪽 자릿수가 scale인 DECIMAL을 나타내요.
분수 리터럴 예시
SELECT 12.578 AS col, TYPEOF(12.578) AS type;
+------+------------+
| col| type|
+------+------------+
|12.578|decimal(5,3)|
+------+------------+
SELECT 12.578E0 AS col, TYPEOF(12.578E0) AS type;
+------+------+
| col| type|
+------+------+
|12.578|double|
+------+------+
SELECT -0.1234567 AS col;
+----------+
| col|
+----------+
|-0.1234567|
+----------+
SELECT -.1234567 AS col;
+----------+
| col|
+----------+
|-0.1234567|
+----------+
SELECT 123. AS col;
+---+
|col|
+---+
|123|
+---+
SELECT 123.BD AS col;
+---+
|col|
+---+
|123|
+---+
SELECT 5E2 AS col;
+-----+
| col|
+-----+
|500.0|
+-----+
SELECT 5D AS col;
+---+
|col|
+---+
|5.0|
+---+
SELECT -5BD AS col;
+---+
|col|
+---+
| -5|
+---+
SELECT 12.578e-2d AS col;
+-------+
| col|
+-------+
|0.12578|
+-------+
SELECT -.1234567E+2BD AS col;
+---------+
| col|
+---------+
|-12.34567|
+---------+
SELECT +3.e+3 AS col;
+------+
| col|
+------+
|3000.0|
+------+
SELECT -3.E-3D AS col;
+------+
| col|
+------+
|-0.003|
+------+
날짜·시간 리터럴
날짜·시간 리터럴은 날짜, 시간 또는 타임스탬프 값을 지정하는 데 사용해요.
날짜 문법
`DATE { 'yyyy' |
'yyyy-[m]m' |
'yyyy-[m]m-[d]d' |
'yyyy-[m]m-[d]d[T]' }
참고: 월이나 일이 지정되지 않으면 01로 기본 설정돼요.
날짜 예시
SELECT DATE '1997' AS col;
+----------+
| col|
+----------+
|1997-01-01|
+----------+
SELECT DATE '1997-01' AS col;
+----------+
| col|
+----------+
|1997-01-01|
+----------+
SELECT DATE '2011-11-11' AS col;
+----------+
| col|
+----------+
|2011-11-11|
+----------+
시간 문법
`TIME { '[h]h:[m]m[:]' |
'[h]h:[m]m:[s]s[.]' |
'[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us]'}
참고: 시, 분, 초가 지정되지 않으면 00으로 기본 설정돼요.
시간 예시
SELECT TIME'12:00' as col;
+--------+
|col |
+--------+
|12:00:00|
+--------+
SELECT TIME'2:0' as col;
+--------+
|col |
+--------+
|02:00:00|
+--------+
SELECT TIME'2:0:3' as col;
+--------+
|col |
+--------+
|02:00:03|
+--------+
SELECT TIME'23:59:59.999999' as col;
+---------------+
|col |
+---------------+
|23:59:59.999999|
+---------------+
타임스탬프 문법
`TIMESTAMP { 'yyyy' |
'yyyy-[m]m' |
'yyyy-[m]m-[d]d' |
'yyyy-[m]m-[d]d ' |
'yyyy-[m]m-[d]d[T][h]h[:]' |
'yyyy-[m]m-[d]d[T][h]h:[m]m[:]' |
'yyyy-[m]m-[d]d[T][h]h:[m]m:[s]s[.]' |
'yyyy-[m]m-[d]d[T][h]h:[m]m:[s]s.[ms][ms][ms][us][us][us][zone_id]'}
참고: 시, 분, 초가 지정되지 않으면 00으로 기본 설정돼요. zone_id는 다음 형태 중 하나여야 해요.
-
Z - Zulu 시간대 UTC+0
-
+|-[h]h:[m]m -
다음 접두사 중 하나(UTC+, UTC-, GMT+, GMT-, UT+, UT-)와 아래 형식의 접미사를 가진 id:
-
+|-h[h] -
+|-hh[:]mm -
+|-hh:mm:ss -
+|-hhmmss -
Europe/Paris같은area/city형태의 지역 기반 영역 ID
참고: zone_id가 지정되지 않으면 세션 로컬 시간대(spark.sql.session.timeZone으로 설정)로 기본 설정돼요.
타임스탬프 예시
SELECT TIMESTAMP '1997-01-31 09:26:56.123' AS col;
+-----------------------+
| col|
+-----------------------+
|1997-01-31 09:26:56.123|
+-----------------------+
SELECT TIMESTAMP '1997-01-31 09:26:56.66666666UTC+08:00' AS col;
+--------------------------+
| col |
+--------------------------+
|1997-01-30 17:26:56.666666|
+--------------------------+
SELECT TIMESTAMP '1997-01' AS col;
+-------------------+
| col|
+-------------------+
|1997-01-01 00:00:00|
+-------------------+
간격 리터럴
간격(interval) 리터럴은 고정된 기간을 지정하는 데 사용해요. 간격 리터럴은 ANSI 문법과 다중 단위(multi-units) 문법 두 가지를 지원해요.
ANSI 문법
ANSI SQL 표준은 간격 리터럴을 다음 형태로 정의해요.
`INTERVAL [ <sign> ] <interval string> <interval qualifier>
여기서 <interval qualifier>는 단일 필드이거나 field-to-field 형태일 수 있어요.
`<interval qualifier> ::= <start field> TO <end field> | <single field>
필드 이름은 대소문자를 구분하지 않으며 YEAR, MONTH, DAY, HOUR, MINUTE, SECOND 중 하나일 수 있어요.
간격 리터럴은 year-month 또는 day-time 간격 타입일 수 있어요. 간격 하위 타입은 <interval string>의 형식을 정의해요.
`<interval string> ::= <quote> [ <sign> ] { <year-month literal> | <day-time literal> } <quote>
<year-month literal> ::= <years value> [ <minus sign> <months value> ] | <months value>
<day-time literal> ::= <day-time interval> | <time interval>
<day-time interval> ::= <days value> [ <space> <hours value> [ <colon> <minutes value> [ <colon> <seconds value> ] ] ]
<time interval> ::= <hours value> [ <colon> <minutes value> [ <colon> <seconds value> ] ]
| <minutes value> [ <colon> <seconds value> ]
| <seconds value>
지원되는 year-month 간격 리터럴과 그 형식:
<interval qualifier> |
간격 문자열 패턴 | 리터럴 예시 |
|---|---|---|
| YEAR | `[+ | -]'[+ |
| YEAR TO MONTH | `[+ | -]'[+ |
| MONTH | `[+ | -]'[+ |
지원되는 day-time 간격 리터럴의 형식:
<interval qualifier> |
간격 문자열 패턴 | 리터럴 예시 |
|---|---|---|
| DAY | `[+ | -]'[+ |
| DAY TO HOUR | `[+ | -]'[+ |
| DAY TO MINUTE | `[+ | -]'[+ |
| DAY TO SECOND | `[+ | -]'[+ |
| HOUR | `[+ | -]'[+ |
| HOUR TO MINUTE | `[+ | -]'[+ |
| HOUR TO SECOND | `[+ | -]'[+ |
| MINUTE | `[+ | -]'[+ |
| MINUTE TO SECOND | `[+ | -]'[+ |
| SECOND | `[+ | -]'[+ |
ANSI 예시
SELECT INTERVAL '2-3' YEAR TO MONTH AS col;
+----------------------------+
|col |
+----------------------------+
|INTERVAL '2-3' YEAR TO MONTH|
+----------------------------+
SELECT INTERVAL -'20 15:40:32.99899999' DAY TO SECOND AS col;
+--------------------------------------------+
|col |
+--------------------------------------------+
|INTERVAL '-20 15:40:32.998999' DAY TO SECOND|
+--------------------------------------------+
다중 단위 문법
`INTERVAL interval_value interval_unit [ interval_value interval_unit ... ] |
INTERVAL 'interval_value interval_unit [ interval_value interval_unit ... ]' |
다중 단위 매개변수
- interval_value
문법:
`[ + | - ] number_value | '[ + | - ] number_value'
- interval_unit
문법:
`YEAR[S] | MONTH[S] | WEEK[S] | DAY[S] | HOUR[S] | MINUTE[S] | SECOND[S] |
MILLISECOND[S] | MICROSECOND[S]
YEAR[S] 또는 MONTH[S] 간격 단위를 다른 단위와 섞는 것은 허용되지 않아요.
다중 단위 예시
SELECT INTERVAL 3 YEAR AS col;
+-------+
| col|
+-------+
|3 years|
+-------+
SELECT INTERVAL -2 HOUR '3' MINUTE AS col;
+--------------------+
| col|
+--------------------+
|-1 hours -57 minutes|
+--------------------+
SELECT INTERVAL '1 YEAR 2 DAYS 3 HOURS';
+----------------------+
| col|
+----------------------+
|1 years 2 days 3 hours|
+----------------------+
SELECT INTERVAL 1 YEARS 2 MONTH 3 WEEK 4 DAYS 5 HOUR 6 MINUTES 7 SECOND 8
MILLISECOND 9 MICROSECONDS AS col;
+-----------------------------------------------------------+
| col|
+-----------------------------------------------------------+
|1 years 2 months 25 days 5 hours 6 minutes 7.008009 seconds|
+-----------------------------------------------------------+
출처: 문서