COLLATION
可将一个排序规则应用于两个或更多字符串。COLLATION
可与 ORDER BY
、GROUP BY
和相等子句一起使用。
语法
COLLATION ( 'expression' [ , 'locale_or_collation_name' ] )
参数
'expression'
- 对某一列名称或对两个或更多
CHAR
或VARCHAR
类型的值进行求值的任何表达式。 'locale_or_collation_name'
- 要在对字符串进行排序时使用的 ICU(Unicode 国际组件)区域设置或排序规则名称。如果您忽略此参数,
COLLATION
将使用与会话区域设置相关联的排序规则。要确定当前的会话区域设置,请输入 vsql 元命令
\locale
:=> \locale en_US@collation=binary
要设置区域设置和排序规则,请使用
\locale
,具体如下所示:=> \locale en_US@collation=binary INFO 2567: Canonical locale: 'en_US' Standard collation: 'LEN_KBINARY' English (United States)
区域设置
用于 COLLATION
的区域设置可以是以下类型之一:
-
默认区域设置
-
会话区域设置
-
您在调用
COLLATION
时指定的区域设置。如果您指定了区域设置,Vertica 会将与该区域规则相关联的排序规则应用于数据。COLLATION
不会修改表中任何其他列的排序规则。
有关有效 ICU 区域设置的列表,请访问区域设置浏览器 (ICU)。
二进制和非二进制排序规则
Vertica 默认区域设置为 en_US@collation=binary
,使用 二进制排序规则。二进制排序规则将对字符串的二进制表示法进行比较。二进制排序规则速度较快,但它可能会导致 K
排在 c
之前的排序顺序,因为 K
的二进制表示法小于 c
。
对于非二进制排序规则,Vertica 将按区域设置规则或指定排序规则转换数据,然后应用排序规则。假设区域设置排序规则为非二进制,而您请求对字符串数据进行 GROUP BY 操作。在这种情况下,无论是否在查询中指定函数,Vertica 都会调用 COLLATION
。
有关排序规则命名的信息,请参阅排序器命名架构。
示例
对 GROUP BY 结果进行排序
以下示例基于 Premium_Customer
表,包含以下数据:
=> SELECT * FROM Premium_Customer;
ID | LName | FName
----+--------+---------
1 | Mc Coy | Bob
2 | Mc Coy | Janice
3 | McCoy | Jody
4 | McCoy | Peter
5 | McCoy | Brendon
6 | Mccoy | Cameron
7 | Mccoy | Lisa
第一个语句显示了 COLLATION
如何将适用于 EN_US
区域设置的排序规则应用于区域设置 LName
的 EN_US
列。Vertica 将对 GROUP BY
的输出进行排序,具体如下所示:
-
包含空格的姓氏
-
“coy”以小写字母开头的姓氏
-
“Coy”以大写字母开头的姓氏
=> SELECT * FROM Premium_Customer ORDER BY COLLATION(LName, 'EN_US'), FName;
ID | LName | FName
----+--------+---------
1 | Mc Coy | Bob
2 | Mc Coy | Janice
6 | Mccoy | Cameron
7 | Mccoy | Lisa
5 | McCoy | Brendon
3 | McCoy | Jody
4 | McCoy | Peter
下一个语句显示了 COLLATION
如何针对区域设置 LName
对 LEN_AS
列进行排序:
-
LEN
表示语言 (L) 为英语 (EN
)。 -
AS
(转换替代字母)指示COLLATION
小写字母出现在大写(转换)字母之前。
在结果中,“coy”以小写字母开头的姓氏将出现在“Coy”以大写字母开头的姓氏之前。
=> SELECT * FROM Premium_Customer ORDER BY COLLATION(LName, 'LEN_AS'), FName;
ID | LName | FName
----+--------+---------
6 | Mccoy | Cameron
7 | Mccoy | Lisa
1 | Mc Coy | Bob
5 | McCoy | Brendon
2 | Mc Coy | Janice
3 | McCoy | Jody
4 | McCoy | Peter
将字符串与等式子句进行比较
在以下查询中,COLLATION
将在对两个英文字符串进行比较时删除空格和标点。随后它将确定这两个字符串在删除标点后是否仍然包含相同的值:
=> SELECT COLLATION ('U.S.A', 'LEN_AS') = COLLATION('USA', 'LEN_AS');
?column?
----------
t
对非英语语言的字符串进行排序
下表包含使用德语字符 eszett(即 ß)的数据:
=> SELECT * FROM t1;
a | b | c
------------+---+----
ßstringß | 1 | 10
SSstringSS | 2 | 20
random1 | 3 | 30
random1 | 4 | 40
random2 | 5 | 50
当您指定排序规则 LDE_S1
时:
-
LDE
表示语言 (L
) 为德语 (DE
)。 -
S1
表示强度 (S
) 为 1(主)。此值表示排序规则无需考虑重音和大小写。
查询将按以下顺序返回数据:
=> SELECT a FROM t1 ORDER BY COLLATION(a, 'LDE_S1'));
a
------------
random1
random1
random2
SSstringSS
ßstringß