这很复杂。正常的排序顺序是 aa, aA, Aa, AA, ab, aB, Ab, AB, a1, A1, 1a, 1A。因此,相同的名称被组合在一起,然后小写字母出现在第一位。数字在 Z 之后。
这与您所追求的很接近。您希望 Ben 在 BOB 之前出现,因为您首先关心 BEN 在 BOB 之前,然后才关心 O 是大写而 e 不是。但是,您希望数字出现在 before a 和大写字母出现在 before 小写字母之前。这最终会产生很大的不同。
您不能轻易做到这一点,因为虽然您希望将单词(bob、BOB)按默认顺序分组,但您希望对单个字符进行不同的处理。您可以先按小数或大数进行分组,但这会将数字放在最后,然后您可以使用二进制顺序在a之前获得A。
order by lower(name), nlssort(name, 'NLS_SORT = BINARY');
我认为这与内置的东西一样接近。数字最后。如果您想坚持您的特殊订单,则必须为其编写一个函数并使用它。
order by my_own_sort_order(name);
编辑(接受后 :-) 再三考虑:您只希望原始排序行为考虑切换大写/小写。您可以为此使用 TRANSLATE:
order by translate(name,
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');