【发布时间】: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