Oracle 排序 varchar2 列最后带有特殊字符

And*_*ndy 8 oracle oracle-10g order-by sorting

如何在 Oracle 中按我自己自定义的顺序对 Varchar2 或 NVarchar2 列进行排序。或者是否有任何现有的选项可以先放字母,然后是数字,然后是所有特殊字符。

我们的第一种方法是使用一个函数来手动将字符映射到数字。

select id, sorted_column
from some_table
order FN_SPECIAL_SORT_KEY(sorted_column,'asc')
Run Code Online (Sandbox Code Playgroud)

特殊的排序函数将每个字符映射到一个 2 位数字,返回值用于排序。这似乎只是非常昂贵的串联,感觉不对。

        for i in 1..length(sorted_text)
        loop
            v_result:=v_result ||  case substr(sorted_text,i,1)
                WHEN ' '   THEN 82 WHEN  '!'   THEN 81 WHEN '"'    THEN 80 WHEN  '#'   THEN 79 WHEN  '$'
                ..............
                WHEN 'u'   THEN 15 WHEN  'U'   THEN 15 WHEN  'v'   THEN 14 WHEN  'V'   THEN 14 WHEN  'w'   THEN 13 WHEN  'W'   THEN 13 WHEN  'x'
                ....
                else 90 end;
        end loop;
Run Code Online (Sandbox Code Playgroud)

我很难想出另一种方法。我想知道这种方法存在哪些问题。也许我们别无选择。

附录 1:

添加排序数据的示例。通常,所有字母字符都不区分大小写,然后是数字 0-9,然后是任何顺序的特殊字符。

这是一个示例排序升序列表。请记住特殊字符是可以互换的,它们都应该在字母和数字之后。在二进制排序中,一些特殊字符在字母之前(即 ' )

我想要的顺序,

AB1$
aCC#
ac'
BZ

Oracle 二进制顺序

AB1$
BZ
ac'
acc#

小智 5

如果 Oracle 已经支持您要指定的排序顺序,则可以通过 NLSSORT 函数进行排序来完成此操作 - 如下所示:

ORDER BY NLSSORT(sorted_column, 'NLS_SORT = XDanish') -- Replace XDanish as appropriate
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到支持的排序顺序列表。


Ada*_*sch 5

一些选项:

  1. 通过触发器将数据的排序版本保留到表中,并使用它。

  2. 使用Oracle Locale Builder构建自定义排序顺序。(警告:我从来没有用过这个,所以我不知道那里可能存在什么问题。)然后你可以使用带有自定义排序顺序的 NLSSORT 函数。