【问题标题】:How can I sort a table by a column for numeric letter first, then case sensitive for alphabet letters如何首先按数字字母的列对表格进行排序,然后对字母字母区分大小写
【发布时间】:2015-01-31 16:48:40
【问题描述】:

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

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

ANNIE
BOB
Daniel
annie
bob
1abc

预期结果是:

1abc    
ANNIE
annie
BOB
bob
Daniel

【问题讨论】:

  • 你会把“Ben”放在哪里?
  • 鲍勃和安妮之间

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


【解决方案1】:

这很复杂。正常的排序顺序是 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');

【讨论】:

  • 是的,你的回答是对的。这就是为什么我无法使用内置函数得到我想要的结果。
  • 我突然想到您可以使用 TRANSLATE。请参阅我的更新答案。
  • 不错的尝试。但我认为这只适用于英语^^
  • 好吧,只需添加您感兴趣的外文字母即可。但是,是的,如果想要特殊排序,甚至对于许多查询,一个函数可能更合适。
【解决方案2】:

你可以这样做:

SELECT *
FROM MyTable
ORDER BY UPPER(MyCol)

【讨论】:

  • 这只是返回随机结果。因为它把安妮当作安妮,有时安妮在前,有时在安妮之后
【解决方案3】:

请试试这个。

Select * from TableName 
Order by ColumnName Collate SQL_Latin1_General_CP850_BIN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2013-06-29
    • 2021-12-28
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多