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)
您可以在此处找到支持的排序顺序列表。
一些选项:
通过触发器将数据的排序版本保留到表中,并使用它。
使用Oracle Locale Builder构建自定义排序顺序。(警告:我从来没有用过这个,所以我不知道那里可能存在什么问题。)然后你可以使用带有自定义排序顺序的 NLSSORT 函数。
归档时间: |
|
查看次数: |
11003 次 |
最近记录: |