如何在Oracle中按自己定义的顺序对Varchar2或NVarchar2列进行排序。或者是否存在任何现有选项,这些选项将首先显示字母,然后显示数字,然后显示所有特殊字符。
我们的第一种方法是使用一个将字符手动映射到数字的函数。
select id, sorted_column
from some_table
order FN_SPECIAL_SORT_KEY(sorted_column,'asc')
特殊的排序功能将每个字符映射到一个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;
我很难想出另一种方法。我想知道这种方法存在哪些问题。也许我们别无选择。
附录1:
添加排序数据的示例。通常,所有字母字符都不区分大小写,然后是数字0-9,然后是任意顺序的特殊字符。
这是一个排序的升序列表示例。请记住,特殊字符是可以互换的,它们都应在字母和数字之后。以二进制排序,某些特殊字符在字母(即')之前
我想要的订单,
AB1 $
ACC#
AC”
BZ
Oracle二进制顺序
AB1 $
BZ
AC”
ACC#