Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 函数 » SQL 函数 (P-Z)

 

SORTKEY 函数 [String]

生成排序关键字值。也就是说,可用于根据备选归类规则对字符串进行排序的值。

语法
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 归类时,支持所有归类定制选项。对于所有其它归类,仅支持区分大小写定制。

返回值

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)'

如果在 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 mydb.db),即使为 SORTKEY 函数指定了数据库归类名称,以下两个子句也可能生成不同的排序顺序:

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 版本。例如,由 10.0.0 之前版本的 SQL Anywhere 创建的排序关键字值与 SQL Anywhere 版本 10 及 SQL Anywhere 版本 11 所创建的值不同。如果将某版本 SQL Anywhere 中创建的排序关键字值用在其它版本的 SQL Anywhere 所创建的数据库中,这种情况可能会对您的应用程序带来问题。

建议您在使用卸载和重装的方式升级 SQL Anywhere 软件时,重新生成存储在数据库中的排序关键字值。

另请参见
标准和兼容性
  • SQL/2003   服务商扩充。

示例

以下语句查询 Employees 表并返回所有雇员的 FirstName 和 Surname,按 Surname 列的 sortkey 值排序,使用 dict 归类(拉丁文-1、英语、法语、德语字典)。

SELECT Surname, GivenName FROM Employees ORDER BY SORTKEY( Surname, 'dict' );

以下示例使用 UCA 归类和定制选项来返回 abc 的 sortkey 值。

SELECT SORTKEY( 'abc', 'UCA(locale=es;case=LowerFirst;accent=respect)' );