字面量指的是 SQL 中做为常数使用的数字或字符串。选择列表中包括字面量以及表达式和内置函数,也可做为常数存在。
Vertica 支持数字类型的文本(整数和数字)、字符串字面量、VARBINARY 字符串字面量和日期/时间字面量。本章将讨论不同的字符串字面量格式。
字面量指的是 SQL 中做为常数使用的数字或字符串。选择列表中包括字面量以及表达式和内置函数,也可做为常数存在。
Vertica 支持数字类型的文本(整数和数字)、字符串字面量、VARBINARY 字符串字面量和日期/时间字面量。本章将讨论不同的字符串字面量格式。
Vertica 支持三种类型的数字:整数、数字和浮点数。
Integers 是小于 2^63 的完整数,且必须是数字。
Numerics 是大于 2^63 或包含具有精度和标度的小数点的完整数。Numerics 可含有指数。以 0x 开头的数字是十六进制数。
Numeric-类型值也可通过使用来自字符串的投影生成。这是一个更普遍的语法。请参阅下文的例子,以及 数据类型强制运算符 (CAST)。
digits
digits.[digits] | [digits].digits
digits e[+-]digits | [digits].digits e[+-]digits | digits.[digits] e[+-]digits
e
存在,则至少有一个数字跟阶码标记符在 (e
)之后。前面的加号 (+) 或减号 (–) 标记不作为常数的一部分;它们是应用于常量的一元运算符。
在大多数情况下,numeric-类型的常数根据上下文,自动强制转换为最合适的类型。如有必要,您可以根据 数据类型强制运算符 (CAST)所述,通过投影将 numeric 值强制转换为指定的数据类型。
不支持浮点字面字面量如果您需要指定浮点数,可根据 数据类型强制运算符 (CAST)进行投影。
Vertica 遵循 IEEE 浮点规范,包括 NaN(非数字)和 Infinity (Inf)。
NaN 不大于同时也不小于任何值(甚至是本身)。换句话说,每当涉及到 NaN,比较始终返回 false。
除法 INTEGERS (x / y) 生成 NUMERIC 结果。您可以使用 // 运算符将结果截断为完整数。
下面是数字类型字面字面量的例子:
42
3.5
4.
.001
5e2
1.925e-3
科学记数法:
=> SELECT NUMERIC '1e10';
?column?
-------------
10000000000
(1 row)
BINARY
缩放:
=> SELECT NUMERIC '1p10';
?column?
----------
1024
(1 row)
=> SELECT FLOAT 'Infinity';
?column?
----------
Infinity
(1 row)
下面的例子对使用 / 和 // 运算符除整数进行了说明:
=> SELECT 40/25;
?column?
----------------------
1.600000000000000000
(1 row)
=> SELECT 40//25;
?column?
----------
1
(1 row)
字符串字面量是使用单引号或双引号引用的字符串值。双引号字符串需使用反斜杠,单引号字符串则不要求使用反斜杠,但 \\'
和 \\\
除外。
您可以将单引号和反斜杠嵌入单引号字符串。
如需包含其他反斜杠(转义)序列,例如 \t
(Tab),您必须使用双引号形式。
对于单引号字符串,在字符串和其前面的词语之间必须加入空格,因为单引号允许用于标识符。
字符字符串字面量是由预定义字符集中的字符组成的序列,两边加上单引号。
'character-seq'
如果字符字符串字面量包含单引号,则必须成对出现。例如:
=> SELECT 'Chester''s gorilla';
?column?
-------------------
Chester's gorilla
(1 row)
Vertica 按照 SQL 标准中指定的要求,使用符合标准的字符串,将反斜杠处理为字符串字面量,而不是处理为转义字符。
=> SELECT 'This is a string';
?column?
------------------
This is a string
(1 row)
=> SELECT 'This \is a string';
WARNING: nonstandard use of escape in a string literal at character 8
HINT: Use the escape string syntax for escapes, e.g., E'\r\n'.
?column?
------------------
This is a string
(1 row)
vmartdb=> SELECT E'This \is a string';
?column?
------------------
This is a string
=> SELECT E'This is a \n new line';
?column?
----------------------
This is a
new line
(1 row)
=> SELECT 'String''s characters';
?column?
--------------------
String's characters
(1 row)
以美元为界的字符串字面量很少使用,但为了方便起见,在此处提供了这种文本。
用来指定字符串字面量的标准语法可能很难理解。在这种情况下,为了提高查询的可读性,Vertica SQL 提供了美元界限。美元界限不是 SQL 标准的一部分,但它通常用来编写复杂的字符串字面量,比符合标准的单引号语法更方便。
$$characters$$
以美元为界的字符串内容被视为字面量。在以美元为界的字符串中,单引号、反斜杠和美元符号字符中没有特殊含义。
关键字或标识符后面以美元为界的字符串必须与前面的单词用空格分隔;否则,美元界限分隔符将作为前面标识符的一部分。
=> SELECT $$Fred's\n car$$;
?column?
-------------------
Fred's\n car
(1 row)
=> SELECT 'SELECT 'fact';';
ERROR: syntax error at or near "';'" at character 21
LINE 1: SELECT 'SELECT 'fact';';
=> SELECT 'SELECT $$fact';$$;
?column?
---------------
SELECT $$fact
(1 row)
=> SELECT 'SELECT ''fact'';';
?column?
----------------
SELECT 'fact';
(1 row)
U&'characters' [ UESCAPE '<Unicode escape character>' ]
启用 StandardConformingStrings
时,Vertica 支持 SQL 标准 Unicode 字符字符串字面量(字符集为仅 UTF-8)。
在输入 Unicode 字符字符串字面量之前,请通过以下方式之一启用符合标准的字符串。
要为所有会话启用,请更新配置参数 StandardConformingStrings。
要在当前会话中将反斜杠视为转义字符,请使用 SET STANDARD_CONFORMING_STRINGS 语句。
另请参阅扩展的字符串字面量。
要以十六进制输入 Unicode 字符(例如 'thank you' 的俄语短语),请使用以下语法:
=> SET STANDARD_CONFORMING_STRINGS TO ON;
=> SELECT U&'\0441\043F\0430\0441\0438\0431\043E' as 'thank you';
thank you
-----------
спасибо
(1 row)
要以十六进制输入德语单词 mude
(其中 u
是变元音):
=> SELECT U&'m\00fcde';
?column?
----------
müde
(1 row)
=> SELECT 'ü';
?column?
----------
ü
(1 row)
要以十六进制输入 LINEAR B IDEOGRAM B240 WHEELED CHARIOT
:
=> SELECT E'\xF0\x90\x83\x8C';
?column?
----------
(wheeled chariot character)
(1 row)
您可以通过 VARBINARY 字符串字面量在字符串字面量中指定十六进制数字或二进制数字。
X''
B''
=> SELECT X'abcd';
?column?
----------
\253\315
(1 row)
=> SELECT B'101100';
?column?
----------
,
(1 row)
E'characters'
您可以采用扩展字符串字面量的 C 样式反斜杠序列,这是结构化查询语言 (SQL) 标准的扩展。您可以通过将字母 E 作为前缀(在开放的单引号前)来指定一个扩展字符串字面量;例如:
E'extended character string\n'
在扩展字符串内,反斜杠字符 (\\
) 启动 C 样式反斜杠序列,在该序列中反斜杠组合和后面的字符或数字代表一个特别的字节值,如下表所示:任何后接反斜杠的字符都按字面理解;例如,要包含一个反斜杠字符,就输入两个反斜杠 (\\\
)。
\\\
是一个反斜杠
\b
是一个退格符
\f
是一个换页符
\n
是一个换行符
\r
是一个回车符
\t
是一个制表符
\x##,
其中 ##
是 1 位或 2 位十六进制数;例如 \x07 是一个制表符
\\###
,其中 ###
是 1、2 或 3 位八进制数,表示带有相应代码的字节。
当扩展的字符串字面量衔接起来跨过线时,只在首个开放的引号前输入 E
。
=> SELECT E'first part o'
'f a long line';
?column?
---------------------------
first part of a long line
(1 row)
将两个相邻的单引号作为一个单引号使用:
=> SELECT 'Aren''t string literals fun?';
?column?
-----------------------------
Aren't string literals fun?
(1 row)
解释命令(例如,在 vsql 中输入的命令,或者在通过 JDBC 或 ODBC 传递的查询中输入的命令)时,Vertica 采用 SQL 标准中指定的符合标准的字符串。在符合标准的字符串中,反斜杠视作字符串字面量(普通字符),而非转义字符。
要将反斜杠视为转义字符,请将配置参数
StandardConformingStrings
设置为 0。
要永久启用符合标准的字符串,请将 StandardConformingStrings
参数设置为 '1',如下面所述。
要使每一会话均为符合标准的字符串,采用设置符合标准的字符串为开启,此设置只有在当前会话将反斜杠视为转义字符。
以下程序可以用于识别您的应用程序中不符合标准的字符串,从而您可以将这些字符串转换为符合标准的字符串:
确保 StandardConformingStrings
参数处于关闭状态,如国际化参数中所述。
=> ALTER DATABASE DEFAULT SET StandardConformingStrings = 0;
如有必要,请打开 EscapeStringWarning
参数。
=> ALTER DATABASE DEFAULT SET EscapeStringWarning = 1;
目前,Vertica 每次在字符串字面量中遇到一个转义字符串时都会返回一项警告。例如,Vertica 在下面的示例中将 \n
解释为换行符:
=> SELECT 'a\nb';
WARNING: nonstandard use of escape in a string literal at character 8
HINT: Use the escape string syntax for escapes, e.g., E'\r\n'.
?column?
----------
a
b
(1 row)
当 StandardConformingStrings
为 ON
时,该字符串解释为四个字符:a \ n b
通过扩展由 Vertica 标记的每个字符来对其进行修改,如以下示例中所示:
E'a\nb'
或者如果该字符串已经引用了单引号,那么使用两个单引号,例如, 'one'' double'.
为全部会话开启 StandardConformingStrings
参数:
=> ALTER DATABASE DEFAULT SET StandardConformingStrings = 1;
这节内容讨论不传递给服务器的 vsql 输入值。
Vertica 将一个字符串字面量中两个连续的单引号视为一个单引号符。例如以下输入,'You''re here!'
忽略了第二个连续引号并返回以下内容:
=> SELECT 'You''re here!';
?column?
--------------
You're here!at
(1 row)
这就是 SQL 标准表示法,且在表格中多见,'You\\'re here!'
,因为反斜杠和之前的解析不同。您需要忽略掉反斜杠:
=> SELECT (E'You\'re here!');
?column?
--------------
You're here!
(1 row)
此更改行为在使用 vsql meta-command \set
时引进一个潜在的不兼容性,这会自动将其命令行实参衔接起来。例如:
\set file '\'' 'pwd' '/file.txt' '\''\echo :file
vsql 接受这四个参数并输出以下内容:
'/home/vertica/file.txt'
Vertica 按如下方式解析相邻的单引号:
\set file '\'''pwd''/file.txt''\''\echo :file
'/home/vertica/file.txt''
注意末尾额外的单引号。这是因为相邻的单引号与引用反斜杠的单引号进行了配对。
额外的引号可以被解析为上面的第一个案例或是将字面意义进行组合,如下:
\set file '\''`pwd`'/file.txt'''\echo :file
'/home/vertica/file.txt'
在这两种情况中,引用反斜杠的单引号应该改为两个单引号,如下:
\set file '''' `pwd` '/file.txt'''
=> SELECT 'This \is a string';
?column?
------------------
This \is a string
(1 row)
=> SELECT E'This \is a string';
?column?
------------------
This is a string
=> SELECT E'This is a \n new line';
?column?
----------------------
This is a
new line
(1 row)
=> SELECT 'String''s characters';
?column?
--------------------
String's characters
(1 row)
输入的日期或时间字面量必须用单引号括起来。可接受几乎任何合理格式的输入,包括符合 ISO 8601 和 SQL 标准、传统的 POSTGRES 和其他格式。
Vertica 可以在 SQL 标准要求之上更灵活地处理日期/时间输入。日期/时间表达式 中说明了日期/时间输入和已识别文本字段(包括月份、星期和时区)的精确解析规则。
Vertica 尝试与时区的 SQL 标准定义兼容。但是,SQL 标准的日期和时间类型与功能组合较为怪异。存在以下明显问题:
虽然 DATE 类型不含关联时区,但 TIME/TIMETZ 类型可以包含关联时区。除非与日期和时间相关联,否则时区在现实世界中几乎没有任何意义,因为偏移量在一年当中会随夏令时边界的变化而变化。
Vertica 假设本地时区适用于任何仅包含日期或时间的数据类型。
默认时区指定为相对于 UTC 的偏移量常数。因此,在跨 DST 边界进行日期/时间算术时,不可能适应夏令时。
为了克服这些困难,Micro Focus 建议您在使用时区时使用包含日期和时间的日期/时间类型。Micro Focus 建议您不要使用类型 TIME WITH TIME ZONE,
,即使它支持传统应用程序且符合 SQL 标准也不例外。
时区和时区约定不仅仅受地球几何形状的影响,还会受政治决策的影响。1900 年代,全球时区开始趋于标准化,但仍然会面临一些随机变化,特别是夏令时规则方面。
Vertica 目前支持从 1902 年到 2038 年这个时间段确立的夏令时规则,对应于完整传统 UNIX 系统时间。一旦时间超出该范围,则视为所选时区的“标准时间”,无论该时间处于一年当中的哪个时段。
系统将以下标记识别为星期几的名称:
系统将以下标记识别月份名称:
表示时间跨度的字面量。
[ @ ] [-] { quantity subtype-unit }[...] [ AGO ]
不同的单位数量会自动叠加。
间隔常量的上下限分别为:
9223372036854775807 usec
到 ‑9223372036854775807 usec
296533 years 3 mons 21 days 04:00:54.775807
到 ‑296533 years ‑3 mons ‑21 days ‑04:00:54.775807
间隔常量的范围是
+/– 263 – 1
微秒。
在 Vertica 中,间隔字段可以增加,允许大浮点数。
请参阅指定间隔输入。
下表列出了可在间隔字面量中指定的子类型单位,分为以下几个主要类别:
Vertica 根据上下文将输入单位 m
解释为月份或分钟。例如,以下命令可创建包含间隔值的单列表:
=> CREATE TABLE int_test(i INTERVAL YEAR TO MONTH);
在以下 INSERT 语句中,Vertica 将间隔字面量 1y 6m
解释为 1 年 6 个月:
=> INSERT INTO int_test VALUES('1y 6m');
OUTPUT
--------
1
(1 row)
=> COMMIT;
COMMIT
=> SET INTERVALSTYLE TO UNITS;
SET
=> SELECT * FROM int_test;
i
-----------------
1 year 6 months
(1 row)
以下 ALTER TABLE 语句可将 DAY TO MINUTE
间隔列添加到表 int_test
中:
=> ALTER TABLE int_test ADD COLUMN x INTERVAL DAY TO MINUTE;
ALTER TABLE
下一个 INSERT 语句将第一列和第二列分别设置为 3y 20m 和 1y 6m。在这种情况下,Vertica 通过以下两种方式解释 m
输入字面量:
对于第 i 列,Vertica 将 m
输入解释为月份,显示 4 年 8 个月。
对于第 x 列,Vertica 将 m
输入解释为分钟。由于间隔定义为 DAY TO MINUTE,因此将插入的输入值 1y 6m
转换为 365 天 6 分钟:
=> INSERT INTO int_test VALUES ('3y 20m', '1y 6m');
OUTPUT
--------
1
(1 row)
=> SELECT * FROM int_test;
i | x
------------------+-----------------
1 year 6 months |
4 years 8 months | 365 days 6 mins
(2 rows)
指定如何解释输出的间隔字面量并为其设置格式,同时可选择性设置精度。间隔限定符由一或两个单元组成:
unit [ TO unit ] [ (p) ]
其中:
单位指定天-时间或年-月子类型。
p 指定精度,0 到 6 之间的整数。
精度仅适用于 SECOND 单位,指定在秒值小数点后显示的小数位数。SECOND 的默认精度为 6。
当 SECOND 为限定符的秒单位时(例如,DAY TO SECOND 或 MINUTE TO SECOND),精度为小数点前 2 位。
例如:
=> SELECT INTERVAL '6 122.538987' MINUTE TO SECOND (5);
?column?
-------------
08:02.53899
(1 row)
有关详细信息,请参阅指定时间间隔精度。
如果间隔省略了间隔限定符,则默认值为 DAY TO SECOND(6)
。
间隔限定符分为以下两个类别:
Vertica 还支持 INTERVALYM
,它是 INTERVAL YEAR TO MONTH
的别名。因此,以下两个语句是等效的:
=> SELECT INTERVALYM '1 2';
?column?
----------
1-2
(1 row)
=> SELECT INTERVAL '1 2' YEAR TO MONTH;
?column?
1-2
(1 row)
请参阅控制间隔格式。