리터럴

리터럴

리터럴(literal, 상수라고도 함)은 고정된 데이터 값을 나타내요. Spark SQL은 다음 리터럴들을 지원해요.

문자열 리터럴

문자열 리터럴은 문자 문자열 값을 지정하는 데 사용해요.

문법

`[ r ] { 'char [ ... ]' | "char [ ... ]" } [ ... ]

매개변수

  • char

문자 집합의 한 문자. 특수 문자를 이스케이프하려면 \를 사용해요(예: ' 또는 \). 유니코드 문자를 표현하려면 \uxxxx 또는 \Uxxxxxxxx 형태의 16비트 또는 32비트 유니코드 이스케이프를 사용해요. 여기서 xxxx와 xxxxxxxx는 각각 16비트와 32비트 코드 포인트를 16진수로 나타낸 것이에요(예: \u3042, 👍\U0001F44D). ASCII 문자는 \ 앞에 8진수를 붙여서 나타낼 수도 있는데, 예를 들어 \101A를 나타내요.

  • r

대소문자를 구분하지 않으며 RAW를 나타내요. 문자열 리터럴이 r 접두사로 시작하면 특수 문자도 유니코드 문자도 \로 이스케이프되지 않아요.

일반 문자열 리터럴(r 접두사 없음)에서는 다음 이스케이프 시퀀스가 인식되고, 다음 규칙에 따라 치환돼요.

  • \0 -> \u0000, 코드 0인 유니코드 문자;
  • \b -> \u0008, 백스페이스;
  • \n -> \u000a, 줄바꿈(linefeed);
  • \r -> \u000d, 캐리지 리턴;
  • \t -> \u0009, 가로 탭;
  • \Z -> \u001A, 치환(substitute);
  • \% -> \%;
  • \_ -> \_;
  • \<다른 문자> -> <다른 문자>, 슬래시를 건너뛰고 문자를 그대로 둠.

위 이스케이프 해제 규칙은 SQL 설정 spark.sql.parser.escapedStringLiteralstrue로 설정하면 끌 수 있어요.

문자열 리터럴의 연속 체인은 하나의 문자열 리터럴로 합쳐져요(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|
+-----------------------------------------------------------+

출처: 문서

더 알아보기 (Learn more)