SQL Oracle排序字符串(数字)和(带数字的字母)
问题描述:
我是oracle新手,遇到问题。 我有一个名为file_id的列。SQL Oracle排序字符串(数字)和(带数字的字母)
当我做一个订单由它按字符串,例如
1
1
10
100
11
11
110
114
12
300
31
4200
B14
B170
B18
编辑: 我想它这样排序。
1
1
10
11
11
12
31
100
300
4200
B14
B18
B170
下面的答案完美地工作。只有我现在遇到的其他问题..我有空白的记录。我怎么能在最后做出空白记录?
1
1
10
11
11
12
31
100
300
4200
BLANK
BLANK
BLANK
BLANK
BLANK
B14
B18
B170
谢谢你的帮忙。
答
select column
from table
order by
regexp_substr(column, '^\D*') nulls first,
to_number(regexp_substr(column, '\d+'))
答
这是一个老问题,但它是在谷歌的第一击,所以我想我会分享一个替代解决方案:
select column
from table
order by
LPAD(column, 10)
的LPAD功能焊垫左侧带空格的字符串的一边,以便结果按数字排序。这适用于非数字值,空值将最后排序。如果您知道要排序的字符串的最大长度(这可能需要调整第二个参数以满足您的需要),这很有效。
来源:http://www.techonthenet.com/oracle/questions/sort1.php
编辑:
我注意到,虽然我的解决方案非常适用于我的情况下,输出是公认的答案(http://www.sqlfiddle.com/#!4/d935b8/2/0)稍有不同:
1
1
10
11
11
12
31
100
110
114
300
A14
A18
4200
A170
(null)
(null)
4200应该在300之后。对于我的情况来说,这已经够好了,但情况并非总是如此。
答
基于以前的解决方案:
SELECT column
FROM table
ORDER BY LPAD(column, (SELECT MAX(LENGTH(column)) FROM table)) ASC
这种方法的好处是,你不需要知道表列大小。
“正确”是什么意思;你想要一个数字排序?接下来是二进制排序? – Ben 2013-03-22 14:25:17
我编辑过,以表明我希望如何进行排序。感谢您提供如此快速的回应。 – user2199531 2013-03-22 14:30:38
@ user2199531通过..按顺序添加一个案例,当col为null,然后2 else 1 end,regexp_substr(...' – DazzaL 2013-03-22 15:49:57