如何按列 varchar2 对表进行排序,其中包含不同情况下的字符:大写、小写、数字字符串
例如,当我按列 NAME 进行排序时,该列的数据是:
ANNIE
BOB
Daniel
annie
bob
1abc
预期结果是:
1abc
ANNIE
annie
BOB
bob
Daniel
如何按列 varchar2 对表进行排序,其中包含不同情况下的字符:大写、小写、数字字符串
例如,当我按列 NAME 进行排序时,该列的数据是:
ANNIE
BOB
Daniel
annie
bob
1abc
预期结果是:
1abc
ANNIE
annie
BOB
bob
Daniel
这是复杂的。正常的排序顺序是 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');
您可以执行以下操作:
SELECT *
FROM MyTable
ORDER BY UPPER(MyCol)
请试试这个。
Select * from TableName
Order by ColumnName Collate SQL_Latin1_General_CP850_BIN