文本

字面量(也称为常量)表示固定数据值。

字符串文本

字符串字面量用于指定字符串值。

语法

'char [ ... ]' | "char [ ... ]"

参数

  • char

    字符集中的一个字符。 使用 \ 来转义特殊字符(例如 '\)。 若要表示 Unicode 字符,请使用格式为 \uxxxx\Uxxxxxxxx 的 16 位或 32 位 Unicode 转义,其中 xxxx 和 xxxxxxxx 分别是十六进制的 16 位和 32 位码位(例如,\u3042 表示 \U0001F44D 表示 👍)。

示例

SELECT 'Hello, World!' AS col;
+-------------+
|          col|
+-------------+
|Hello, World!|
+-------------+
```sql
SELECT "Spark SQL" AS col;
+-------------+
|          col|
+-------------+
|Spark SQL    |
+-------------+
SELECT 'it\'s $10.' AS col;
+---------+
|      col|
+---------+
|It's $10.|
+---------+

二进制文本

二进制字面量用于指定字节序列值。

语法

X { 'num [ ... ]' | "num [ ... ]" }

参数

  • num

    0 到 F 之间的任何十六进制数字。

示例

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 ]

整数字面量参数

  • 数字: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 [ ... ]

小数字面量参数

  • 数字:0 到 9 的任意数字。
  • D:不区分大小写,指示 DOUBLE,一个 8 个字节的双精度浮点数。
  • F:不区分大小写,指示 FLOAT,一个 4 个字节的单精度浮点数。
  • 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]' }

注意

如果未指定 monthday,则默认为 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]'}

注意

如果未指定 hourminutesecond,则默认为 00

zone_id 应为以下形式之一:

  • Z - 祖鲁时区 UTC+0
  • +|-[h]h:[m]m
  • 具有 UTC+UTC-GMT+GMT-UT+UT- 前缀的 ID 和具有以下格式的后缀:
    • +|-h[h]
    • +|-hh[:]mm
    • +|-hh:mm:ss
    • +|-hhmmss
  • 基于区域的区域 ID,格式为 <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>

字段名称不区分大小写,可以是 YEARMONTHDAYHOURMINUTESECOND 之一。 间隔字面量可以为“年-月”或“日期-时间间隔”的类型。 间隔子类型定义 <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>

支持的“年-月”间隔字面量和所采用的格式:

|<interval qualifier>|间隔字符串模式|字面量实例| |———|——-|————| |YEAR|[+|-]'[+|-]y'|INTERVAL -'2021' YEAR| |YEAR TO MONTH|[+|-]'[+|-]y-m'|INTERVAL '-2021-07' YEAR TO MONTH| |MONTH|[+|-]'[+|-]m'|interval '10' month| 支持的日期时间间隔字面量格式:|<interval qualifier>|间隔字符串模式|字面量实例| |———|—-|——————-| |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]
    

不允许将“年”或“月”间隔单位与其他单位混合使用。

多单位示例

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|
+-----------------------------------------------------------+