1

如何按列 varchar2 对表进行排序,其中包含不同情况下的字符:大写、小写、数字字符串

例如,当我按列 NAME 进行排序时,该列的数据是:

ANNIE
BOB
Daniel
annie
bob
1abc

预期结果是:

1abc    
ANNIE
annie
BOB
bob
Daniel
4

3 回答 3

1

这是复杂的。正常的排序顺序是 aa, aA, Aa, AA, ab, aB, Ab, AB, a1, A1, 1a, 1A。因此,相同的名称被组合在一起,然后小写字母出现在第一位。数字在 Z 之后。

这接近你所追求的。您希望 Ben 在 BOB 之前出现,因为您首先关心 BEN 在 BOB 之前,然后才关心 O 是大写而 e 不是。但是,您希望数字a 之前,大写在小写之前。这最终会产生很大的不同。

您不能轻易做到这一点,因为虽然您希望将单词 (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');
于 2014-12-03T08:42:05.283 回答
0

您可以执行以下操作:

SELECT *
FROM MyTable
ORDER BY UPPER(MyCol)
于 2014-12-03T08:01:25.833 回答
0

请试试这个。

Select * from TableName 
Order by ColumnName Collate SQL_Latin1_General_CP850_BIN
于 2014-12-03T08:06:19.290 回答