字面值
字面值(也稱為常數)代表固定資料值。Spark SQL 支援下列字面值
字串字面值
字串字面值用於指定字元字串值。
語法
[ r ] { 'char [ ... ]' | "char [ ... ]" }
參數
-
char
字元集中的其中一個字元。使用
\
來跳脫特殊字元(例如,'
或\
)。若要表示 unicode 字元,請使用\uxxxx
或\Uxxxxxxxx
形式的 16 位元或 32 位元 unicode 跳脫,其中 xxxx 和 xxxxxxxx 分別是 16 位元和 32 位元的 16 進位碼點(例如,\u3042
代表あ
,\U0001F44D
代表👍
)。 -
r
不區分大小寫,表示
RAW
。如果字串字面值以r
前置詞開頭,則特殊字元和 unicode 字元都不會被\
跳脫。
範例
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.|
+----------------------------------+
二進位字面值
二進位字面值用於指定位元組序列值。
語法
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|
+----+
數字字面值
數字字面值用於指定固定或浮點數。數字字面值有兩種:整數字面值和小數字面值。
整數字面值語法
[ + | - ] digit [ ... ] [ L | S | Y ]
整數字面值參數
-
digit
任何 0 到 9 的數字。
-
L
不區分大小寫,表示
BIGINT
,為 8 位元組的帶正負號整數。 -
S
不區分大小寫,表示
SMALLINT
,為 2 位元組的帶正負號整數。 -
Y
大小寫不敏感,表示
TINYINT
,它是一個 1 位元組的帶正負號整數。 -
預設(沒有後綴)
表示一個 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_digits { [ BD ] | [ exponent BD ] } | digit [ ... ] [ exponent ] BD
雙精度文字
decimal_digits { D | exponent [ D ] } | digit [ ... ] { exponent [ D ] | [ exponent ] D }
單精度文字
decimal_digits { F | exponent [ F ] } | digit [ ... ] { exponent [ F ] | [ exponent ] F }
當 decimal_digits 定義為
[ + | - ] { digit [ ... ] . [ digit [ ... ] ] | . digit [ ... ] }
且 exponent 定義為
E [ + | - ] digit [ ... ]
小數文字參數
-
digit
任何 0 到 9 的數字。
-
D
大小寫不敏感,表示
DOUBLE
,它是一個 8 位元組的雙精度浮點數。 -
F
大小寫不敏感,表示
FLOAT
,它是一個 4 位元組的單精度浮點數。 -
BD
大小寫不敏感,表示
DECIMAL
,總位數為精度,小數點右邊的位數為比例。
小數文字範例
SELECT 12.578 AS col;
+------+
| col|
+------+
|12.578|
+------+
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|
+----------+
時間戳記語法
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-,以及下列格式的後綴
+|-h[h]
+|-hh[:]mm
+|-hh:mm:ss
+|-hhmmss
- 區域為基礎的時區識別碼,格式為
area/city
,例如Europe/Paris
注意:如果未指定 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|
+-------------------+
間隔字面值
間隔文字用於指定一個固定時間段。間隔文字支援兩種語法:ANSI 語法和多單位語法。
ANSI 語法
ANSI SQL 標準定義間隔文字的格式為
INTERVAL [ <sign> ] <interval string> <interval qualifier>
其中 <interval qualifier>
可以是單一欄位或欄位對欄位的形式
<interval qualifier> ::= <start field> TO <end field> | <single field>
欄位名稱大小寫不敏感,可以是 YEAR
、MONTH
、DAY
、HOUR
、MINUTE
和 SECOND
之一。
區間文字可為年-月或日-時區間類型。區間子類型定義 <區間字串>
的格式
<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 | [+|-]'[+|-]y' |
INTERVAL -'2021' YEAR |
YEAR TO MONTH | [+|-]'[+|-]y-m' |
INTERVAL '-2021-07' YEAR TO MONTH |
MONTH | [+|-]'[+|-]m' |
interval '10' month |
支援的日-時區間文字格式
<區間限定詞> |
區間字串樣式 | 文字實例 |
---|---|---|
DAY | [+|-]'[+|-]d' |
INTERVAL -'100' DAY |
DAY TO HOUR | [+|-]'[+|-]d h' |
INTERVAL '-100 10' DAY TO HOUR |
DAY TO MINUTE | [+|-]'[+|-]d h:m' |
INTERVAL '100 10:30' DAY TO MINUTE |
DAY TO SECOND | [+|-]'[+|-]d h:m:s.n' |
INTERVAL '100 10:30:40.999999' DAY TO SECOND |
HOUR | [+|-]'[+|-]h' |
INTERVAL '123' HOUR |
HOUR TO MINUTE | [+|-]'[+|-]h:m' |
INTERVAL -'-123:10' HOUR TO MINUTE |
HOUR TO SECOND | [+|-]'[+|-]h:m:s.n' |
INTERVAL '123:10:59' HOUR TO SECOND |
MINUTE | [+|-]'[+|-]m' |
interval '1000' minute |
MINUTE TO SECOND | [+|-]'[+|-]m:s.n' |
INTERVAL '1000:01.001' MINUTE TO SECOND |
SECOND | [+|-]'[+|-]s.n' |
INTERVAL '1000.000001' 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] Mix of the YEAR[S] or MONTH[S] interval units with other units is not allowed.
多單位範例
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|
+-----------------------------------------------------------+