如何通过列varchar2对表进行排序,其中包含不同情况下的字符:upper,lower,numeric string
例如,当我按列NAME执行订单时,列的数据为:
ANNIE
BOB
Daniel
annie
bob
1abc
预期结果是:
1abc
ANNIE
annie
BOB
bob
Daniel
答案 0 :(得分:1)
这很复杂。正常排序顺序是aa,aA,Aa,AA,ab,aB,Ab,AB,a1,A1,1a,1A。因此,相同的名称组合在一起,然后小写首先出现。数字来自Z。
这与你所追求的非常接近。你想让Ben来到BOB之前,因为你首先关心的是BEN在BOB之前,而且只关注O是资本而e不是。但是,您希望数字来自之前的和小写之前的大写。这最终会产生很大的不同。
你不能轻易地做到这一点,因为虽然你想要将单词(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');
答案 1 :(得分:0)
您可以执行以下操作:
SELECT *
FROM MyTable
ORDER BY UPPER(MyCol)
答案 2 :(得分:0)
请试一试。
Select * from TableName
Order by ColumnName Collate SQL_Latin1_General_CP850_BIN