Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.
生成排序关键字值。也就是说,可用于根据备选归类规则对字符串进行排序的值。
SORTKEY( string-expression [, { collation-id | collation-name[ ( collation-tailoring-string) ] } ] )
string-expression 字符串表达式必须包含使用数据库的字符集编码的字符。
如果 string-expression 是空字符串,则 SORTKEY 函数将返回长度为零的二进制值。如果 string-expression 为 NULL,则 SORTKEY 函数返回 NULL 值。空字符串的排序顺序值不同于数据库列中的 NULL 字符串。
SORTKEY 函数可以处理的字符串的最大长度是 254 个字节。任何多出的部分都将被忽略。
collation-name 一个字符串或字符变量,用于指定要使用的排序顺序的名称。还可以指定别名 char_collation 或等效的 db_collation,以生成数据库正在使用的 CHAR 归类所使用的 sortkey。类似地,可以指定别名 nchar_collation 以生成数据库正在使用的 NCHAR 归类所使用的 sortkey。
collation-id 一个变量、整数常量或字符串,用于指定要使用的排序顺序的 ID 号。如果不指定 collation-id,则缺省值为缺省的 Unicode 多语言。
collation-tailoring-string 您还可以指定归类定制选项 (collation-tailoring-string),以便能够对字符的排序和比较进行更多的控制。这些选项采用 "关键字=值" 对的形式,包括在圆括号内,位于归类名后。例如,'UCA(locale=es;case=LowerFirst;accent=respect)'。指定这些选项的语法与为 CREATE DATABASE 语句的 COLLATION 子句定义的语法完全相同。
'UCA(locale=es;case=LowerFirst;accent=respect)'
指定 UCA 归类时,支持所有归类定制选项。对于所有其它归类,仅支持区分大小写定制。
BINARY
SORTKEY 函数生成的值可用于根据预定义的排序顺序行为对结果进行排序。这样,您就可以使用数据库归类无法提供的字符排序顺序行为。返回值是一个二进制值,包含有关通过 SORTKEY 函数保留的输入字符串的已编码排序顺序信息。例如,可以将 SORTKEY 函数返回的值存储在包含源字符串的列中。当您想按所需顺序检索字符数据时,SELECT 语句只需要加入作用于包含 SORTKEY 函数运行结果的列的 ORDER BY 子句即可。
SORTKEY 函数保证它为一组给定的排序顺序标准返回的值适用于对 VARBINARY 数据类型执行的二进制比较。
生成查询的 sortkey 开销可能很大。作为频繁请求的 sortkey 的一种替代,可以考虑创建一个计算列来保存 sortkey 值,然后在查询的 ORDER BY 子句中引用该列。
SORTKEY 函数的输入最多可以为每个输入字符生成 6 个字节的排序顺序信息。SORTKEY 函数的输出是 VARBINARY 类型,最大长度为 1024 个字节。
如果在生成排序关键字期间为归类指定 UCA,缺省情况下归类定制是区分重音和大小写的。例如,如果 UCA 指定自身,应用的缺省定制等效于 'UCA(case=UpperFirst;accent=Respect;punct=Primary)'。
'UCA(case=UpperFirst;accent=Respect;punct=Primary)'
如果在 SORTKEY 的第二个参数中提供不同的定制,这些设置替换缺省设置。例如,以下两个语句是等效的:
SELECT SORTKEY( 'abc', 'UCA(accent=Ignore)' ); SELECT SORTKEY( 'abc', 'UCA(case=UpperFirst;accent=Ignore;punct=Primary)' );
如果指定非 UCA 归类,缺省情况下,归类定制也是区分重音和大小写的。但是,对于非 UCA 归类,只能使用归类定制来替换区分大小写特性。例如:
SELECT SORTKEY( 'abc', '1252LATIN1(case=Respect)' );
如果创建数据库时未指定定制选项(例如,dbinit -c -zn uca -dba DBA,sql mydb.db),即使为 SORTKEY 函数指定了数据库归类名称,以下两个子句也可能生成不同的排序顺序:
dbinit -c -zn uca -dba DBA,sql mydb.db
ORDER BY string-expression ORDER BY SORTKEY( string-expression, database-collation-name )
这是因为数据库创建所使用的缺省定制设置与 SORTKEY 函数所使用的缺省定制设置不同。要使 SORTKEY 获得与数据库归类相同的行为,可以为 collation-tailoring-string 提供与数据库归类的设置匹配的定制语法,也可以为 collation-name 指定 db_collation。例如:
SORTKEY( expression, 'db_collation' )
根据所使用的 SQL Anywhere 版本,会生成不同的排序关键字值。如果将某版本 SQL Anywhere 中创建的排序关键字值用在其它版本的 SQL Anywhere 所创建的数据库中,可能会带来排序问题。如果出现排序问题,应重新生成排序关键字值。
通过卸载/重装来升级数据库时,也应重新生成排序关键字值。
SQL/2008 服务商扩充。
以下语句查询 Employees 表并返回所有雇员的 FirstName 和 Surname,按 Surname 列的 sortkey 值排序,使用 dict 归类(拉丁文-1、英语、法语、德语字典)。
SELECT Surname, GivenName FROM GROUPO.Employees ORDER BY SORTKEY( Surname, 'dict' );
以下示例使用 UCA 归类和定制选项来返回 abc 的 sortkey 值。
SELECT SORTKEY( 'abc', 'UCA(locale=es;case=LowerFirst;accent=respect)' );