如何先按字母对数字字母排序,然后对字母字母区分大小写

时间:2014-12-03 07:54:48

标签: sql select oracle11g sql-order-by nls-sort

如何通过列varchar2对表进行排序,其中包含不同情况下的字符:upper,lower,numeric string

例如,当我按列NAME执行订单时,列的数据为:

ANNIE
BOB
Daniel
annie
bob
1abc

预期结果是:

1abc    
ANNIE
annie
BOB
bob
Daniel

3 个答案:

答案 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