COLLATION

可将一个排序规则应用于两个或更多字符串。COLLATION 可与 ORDER BYGROUP BY 和相等子句一起使用。

语法

COLLATION ( 'expression' [ , 'locale_or_collation_name' ] )

参数

'expression'
对某一列名称或对两个或更多 CHARVARCHAR 类型的值进行求值的任何表达式。
'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 区域设置的排序规则应用于区域设置 LNameEN_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 如何针对区域设置 LNameLEN_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ß