字面量(Literal)
📄字数 3.6K
👁️阅读量 加载中...
一、概述
术语 “文字” 和 “常量值” 是同义词,指的是固定的数据值。
虚谷数据库支持以下字面量:
- 文本字面量
- 数值字面量
- 日期和时间字面量
- 间隔字面量
- 位值字面量
- 十六进制字面量
- 空值
- 布尔字面量
例如,'XUGU'
、'DATABASE'
和'101'
都是字符文字;5001
是数字文字。
字符文字用单引号括起来,以便将其与模式对象名称区分开来。
二、文本字面量 (Text Literals)
定义:
文本字面量是使用单引号' '
引起来的字符串,用来在表达式、条件、SQL 函数、SQL 语句中指定字符串的值。
文本字面量本身具有 CHAR
数据类型的属性。
语法:
参数说明:
- 单引号作为分隔符时:
char
是用户字符集中的任何字符。- 要在字面量中表示一个单引号,请输入两个单引号
''
,或使用转义字符。
- 使用
Q
或q
替代单引号作为分隔符时:- 最外层的
' '
是分别位于开头delimiter
之前和结尾delimiter
之后的两个单引号。 char
是用户字符集中的任何字符。- 可以包含引号
' "
。 - 若
delimiter
后面没有单引号,可以包含delimiter
本身。
- 可以包含引号
delimiter
是[
,{
,<
, '\' 或(
之一,结尾的delimiter
必须分别是]
,}
,>
, '\' 或)
。
- 最外层的
示例:
sql
SQL> SELECT '这是文本' FROM dual;
Reconnect ok.
+----------+
| EXPR1 |
+----------+
| 这是文本 |
+----------+
SQL> SELECT q'<abcd1>' FROM dual;
+-------+
| EXPR1 |
+-------+
| abcd1 |
+-------+
SQL> SELECT Q'{defa3}' FROM dual;
+-------+
| EXPR1 |
+-------+
| defa3 |
+-------+
三、数值字面量 (Numeric Literals)
定义:
数值字面量用于指定定点数和浮点数的值。
用法:
当表达式、条件、SQL 函数和 SQL 语句中出现数字时,需要用数字字面量来指定值。
语法:
参数说明:
+
或-
表示正值或负值。如果省略符号,则默认为正值。digit
是0, 1, 2, 3, 4, 5, 6, 7, 8, 9
之一。
四、日期时间字面量 (Datetime Literals)
虚谷数据库支持四种日期时间数据类型:DATE
、TIMESTAMP
、TIMESTAMP WITH TIME ZONE
和 TIMESTAMP WITH LOCAL TIME ZONE
。
4.1 DATE字面量
DATE
字面量可以通过字符串指定,或者可以使用 TO_DATE
函数将字符或数字值转换为日期值。
用法:
使用
DATE
值指定日期字面量:SQLDATE('2025-07-25')
使用
to_date
生成指定日期值格式的字面量:SQLTO_DATE('2025-07-25 15:35:30', 'YYYY-MM-DD HH24:MI:SS')
4.2 TIMESTAMP字面量
TIMESTAMP
数据类型存储了年、月、日、时、分、秒和小数秒值的值。
如下所示:
SQL
TIMESTAMP('2025-07-25 12:36:52.421')
4.3 TIMESTAMP WITH TIME ZONE字面量
TIMESTAMP WITH TIME ZONE
数据类型是 TIMESTAMP 的一个变体,它包含时区区域名称或时区偏移量。
如下所示:
SQL
TIMESTAMP('2025-07-25 12:36:52.421 +08:00')
当两个TIMESTAMP WITH TIME ZONE
字面量中的值表示 GMT 时区的同一时刻,那么尽管它们的时区字段的值不同,它们也被视为相同的字面量。
如以下示例所示,GMT-8 时区的早上 8 点和 GMT-5 时区的早上11点其实是同一时刻:
SQL
TIMESTAMP('2025-07-25 08:00:00 -08:00')
TIMESTAMP('2025-07-25 11:00:00 -05:00')
五、区间字面量 (Interval Literals)
定义:
区间字面量指定一个时间段。可以用年和月来指定这些差异,也可以用天、小时、分钟和秒来指定。
虚谷数据库支持多种类型的间隔文字,每种类型都包含一个前导字段,并且可能包含一个尾随字段。前导字段定义被测量日期或时间的基本单位。
尾随字段定义被考虑的基本单位的最小增量。
语法:
参数说明:
time
:指定日期的数字,要求为整数。time_expr
指定HH [ : MI [ : SS [ . n ]]]
或MI [ : SS [ . n ]] 或 SS [ . n ]
格式的时间,其中 n 指定秒的小数部分。leading_precision
是前导字段的位数。seconds_precision
是SECOND
日期时间字段小数部分的位数。
precision
的取值参考时间间隔类型
示例:
SQL
SQL> SELECT INTERVAL '100' YEAR(3) FROM dual;
+------------+
| EXPR1 |
+------------+
| 100 |
+------------+
SQL> SELECT INTERVAL '3' MONTH FROM dual;
+------------+
| EXPR1 |
+------------+
| 3 |
+------------+
SQL> SELECT INTERVAL '1-3' YEAR TO MONTH FROM dual;
+--------------+
| EXPR1 |
+--------------+
| 1-03 |
+--------------+
SQL> SELECT INTERVAL '7' DAY FROM dual;
+------------+
| EXPR1 |
+------------+
| 7 |
+------------+
SQL> SELECT INTERVAL '3 04' DAY TO HOUR FROM dual;
+-------------+
| EXPR1 |
+-------------+
| 3 04 |
+-------------+
SQL> SELECT INTERVAL '2 12:30' DAY TO MINUTE FROM dual;
+---------------+
| EXPR1 |
+---------------+
| 2 12:30 |
+---------------+
SQL> SELECT INTERVAL '1 01:01:01' DAY TO SECOND FROM dual;
+-------------------------+
| EXPR1 |
+-------------------------+
| 1 01:01:01.000000 |
+-------------------------+
SQL> SELECT INTERVAL '1 01:01:01.123' DAY TO SECOND(3) FROM dual;
+-------------------------+
| EXPR1 |
+-------------------------+
| 1 01:01:01.123000 |
+-------------------------+
SQL> SELECT INTERVAL '12:30' HOUR TO MINUTE FROM dual;
+-------------+
| EXPR1 |
+-------------+
| 12:30 |
+-------------+
SQL> SELECT INTERVAL '30' MINUTE FROM dual;
+------------+
| EXPR1 |
+------------+
| 30 |
+------------+
SQL> SELECT INTERVAL '5.678' SECOND(3) FROM dual;
+-------------------+
| EXPR1 |
+-------------------+
| 5.678000 |
+-------------------+
六、位值字面量(Bit-Value Literals)
定义:
位值字面量使用b'val'
表示法来书写。val
是使用 0 和 1 书写的二进制值。
语法:
参数说明: val
为数字 0 或者 1。
示例:
SQL
SQL> select b'1011', B'1101' FROM dual;
+------------+------------+
| EXPR1(BIT) | EXPR2(BIT) |
+------------+------------+
| b'1011' | b'1101' |
+------------+------------+
空的位值(b'')求值为零长度的二进制字符串。转换为数字时,结果为0:
sql
SQL> SELECT LENGTH(B''), LENGTH(b'') FROM dual;
+----------------+----------------+
| EXPR1(INTEGER) | EXPR2(INTEGER) |
+----------------+----------------+
| 0 | 0 |
+----------------+----------------+
七、十六进制字面量(Hexadecimal Literals)
定义:
十六进制文字值使用X'val'
表示法书写,其中val
包含十六进制数字(0..9、A..F、a..f)
。
默认情况下,十六进制文字是一个二进制字符串,其中每对十六进制数字代表一个字符。书写包含奇数个数字的十六进制字面量,会被视为有一个额外的前导 0。例如 X'abc'
等于 X'0abc'
。
语法:
参数说明: val
为十六进制数字(0..9、A..F、a..f)
。
示例:
sql
SQL> SELECT HEX(X'01AF'), HEX(X'01af'), HEX(x'01AF'), HEX(x'01af') FROM dual;
+-------+-------+-------+-------+
| EXPR1 | EXPR2 | EXPR3 | EXPR4 |
+-------+-------+-------+-------+
| 01AF | 01AF | 01AF | 01AF |
+-------+-------+-------+-------+
空十六进制值(X'')的计算结果为零长度二进制字符串。转换为数字时,结果为0:
sql
SQL> select LENGTH(x'') FROM dual;
+-------+
| EXPR1 |
+-------+
| 0 |
+-------+
八、空值字面量(NULL Values)
定义:
NULL
值表示“无数据”。NULL
可以用任何大小写形式书写。
说明:
NULL
值与数值类型的0
或字符串类型的空字符串等值不同。- 对于使用
ORDER BY
进行排序,NULL
值在升序排序时排在其他值之前,在降序排序时排在其他值之后。 NULL
在特定的函数中使用需要指定类型,否则会导致无法正确调用函数。NULL:CHAR
。
九、布尔字面量(Boolean Literals)
定义:
常量TRUE
和FALSE
等于 1 和 0,它是大小写不敏感的。
示例:
sql
SQL> SELECT TRUE, true, tRuE, FALSE, FaLsE, false FROM dual;
+-------+-------+-------+-------+-------+-------+
| EXPR1 | EXPR2 | EXPR3 | EXPR4 | EXPR5 | EXPR6 |
+-------+-------+-------+-------+-------+-------+
| T | T | T | F | F | F |
+-------+-------+-------+-------+-------+-------+