科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道DB2用户定义函数实现多种语言的排序

DB2用户定义函数实现多种语言的排序

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文主要关注 DB2 V8 for Linux, UNIX, and Windows,但是这个 UDF 示例也可以用在即将发布的 Viper 上。这个 UDF 也应该能够用在 DB2 V7 FP3 或更高版本上,但是这没有经过测试。

来源:IT专家网 2008年6月4日

关键字: IBM 数据库 DB2

  • 评论
  • 分享微博
  • 分享邮件
不同的语言用不同的规则来决定字母的次序。例如,英语从字母 A 排序到 Z,没有例外,如第一个示例所示。

查询 1. 用英语排序规则进行排序

SELECT NAME FROM SORTKEY_NAMES
    ORDER BY ICU.SORTKEY(NAME, 'LEN')

结果 1. 用英语排序规则进行排序

NAME
    --------------------
    Alice
    Celine
    Charles
    Cindy
    Don
    Hillary
    Ian
    Sam

但是在斯洛伐克语中,两个字符的组合 CH 排在字母 H 和 I 之间。

查询 2. 用斯洛伐克语排序规则进行排序

SELECT NAME FROM SORTKEY_NAMES
    ORDER BY ICU.SORTKEY(NAME, 'LSK')

结果 2. 用斯洛伐克语排序规则进行排序

NAME
    --------------------
    Alice
    Celine
    Cindy
    Don
    Hillary
    Charles
    Ian
    Sam

注意,Charles 现在位于 Hillary 和 Ian 之间。

比较

一些语言对于同一个字符有不同的表示方法。例如,在德语中,字母 ä 等于 ae,ö 等于 oe,ü 等于 ue。在 SQL 中进行比较时,并不考虑这些替代表示方法。

假设有两个德国城市名列表: NuernbergNürnberg

LuebeckLuebeck

KölnKoeln

当使用普通的 SQL 联结这两个列表时,不考虑替代的字符表示方法。

查询 3. 未规范化的联结

SELECT G1.CITY AS CITY1, G2.CITY AS CITY2
    FROM SORTKEY_GERMAN1 AS G1, SORTKEY_GERMAN2 AS G2
    WHERE G1.CITY = G2.CITY
    ORDER BY G1.CITY

结果 3. 未规范化的联结

CITY1CITY2
    -------------------- --------------------
    LuebeckLuebeck

注意,在这两个表中只有拼写完全相同的城市名才被认为是相等的。

但是,SORTKEY UDF 可以处理字符的不同表示方法。在这种情况下,我们使用德语排序规则的 “phonebook” 变体并将强度设置为 1,从而忽略重音差异。(排序规则选项的完整列表见 “排序规则名”。)

查询 4. 规范化的联结

SELECT G1.CITY AS CITY1, G2.CITY AS CITY2
    FROM SORTKEY_GERMAN1 AS G1, SORTKEY_GERMAN2 AS G2
    WHERE ICU.SORTKEY(G1.CITY, 'LDE_KPHONEBOOK_S1') =
    ICU.SORTKEY(G2.CITY, 'LDE_KPHONEBOOK_S1')
    ORDER BY G1.CITY

结果 4. 规范化的联结

CITY1CITY2
    -------------------- --------------------
    KölnKoeln
    LuebeckLuebeck
    NuernbergNürnberg

通过使用排序键(而不是值本身)进行比较,适当地处理了名称中的次要差异。通过选择适当的排序规则,可以根据语言进行比较、忽略大小写和重音差异或者完全忽略某些字符。

在 ORDER BY 子句中,修改一个排序规则的强度来忽略字符属性可能会导致不确定的查询结果次序。例如, ORDER BY ICU.SORTKEY(COLUMN, 'S1') (这里使用的排序规则会忽略大小写和重音)会正确地排列 A < B < C。但是,这个排序规则不区分 “apple”、“Apple” 和 “APPLE”,可能以任意次序返回这些单词。

SORTKEY 产生的值依赖于使用的排序规则。因此,当在谓词中使用 SORTKEY 时,比较的两边要使用完全相同的排序规则。

性能考虑因素

当在查询中引入 UDF 时,它会损害查询的性能。对数据库和查询的设计进行仔细地分析,可以将性能影响最小化。

要考虑的一些因素是:

使用固定的排序规则名

尽可能少使用 SORTKEY

使用生成的列

使用固定的排序规则名

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章