【问题标题】:How can I get a natural numeric sort order in Oracle?如何在 Oracle 中获得自然数字排序顺序?
【发布时间】:2020-03-03 20:57:51
【问题描述】:

我有一列有一个字母后跟数字或字母:

ID_Col
------
S001
S1001
S090
SV911
SV800
Sfoofo
Szap
Sbart

我怎样才能自然地用数字优先(ASC)然后按字母顺序排列?如果它以S 开头并且其余字符是数字,则按数字排序。否则,按字母排序。所以SV911应该用字母排序在最后,因为它还包含V。例如

ID_Col
------
S001
S090
S1001
Sbart
Sfoofo
SV800
SV911
Szap

我看到这个solution 使用正则表达式与TO_NUMBER 函数相结合,但由于我也有没有数字的条目,这似乎对我不起作用。我尝试了表达:

ORDER BY 
    TO_NUMBER(REGEXP_SUBSTR(ID_Col, '^S\d+$')), 
    ID_Col 

    /* gives ORA-01722: invalid number */

【问题讨论】:

  • 您查询中的正则表达式不是您提到的答案中的那个。我建议重新阅读答案,并更正正则表达式。提示:在 SELECT 块中测试它,并且没有 TO_NUMBER(),所以看看它是否返回了你期望的结果。
  • @MatBailie 我相信“\d+”等价于正则表达式中的“[0-9]+”对吧?无论如何,是的,它确实返回了我的预期。我还尝试了“[0-9]+”和“[[:digit:]]+”,它们给出了同样的错误。

标签: sql regex oracle sql-order-by natural-sort


【解决方案1】:

这会有帮助吗?

SQL> with test (col) as
  2  (select 'S001'   from dual union all
  3   select 'S1001'  from dual union all
  4   select 'S090'   from dual union all
  5   select 'SV911'  from dual union all
  6   select 'SV800'  from dual union all
  7   select 'Sfoofo' from dual union all
  8   select 'Szap'   from dual union all
  9   select 'Sbart'  from dual
 10  )
 11  select col
 12  from test
 13  order by substr(col, 1, 1),
 14    case when regexp_like(col, '^[[:alpha:]]\d') then to_number(regexp_substr(col, '\d+$')) end,
 15    substr(col, 2);

COL
------
S001
S090
S1001
Sbart
Sfoofo
SV800
SV911
Szap

8 rows selected.

SQL>

【讨论】:

  • 如何计算包含多个字母和数字的条目?我忘了在问题中添加它,只是添加了示例,例如SV911。使用您的解决方案,我得到 [S911, SV911, S912],但我希望 SV911 以字母结尾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多