我在使用oracle 10g时遇到排序问题。不知道它是否特定于10g。
我有下表:
ID NAME
1 A.1
2 A.3
3 A.4
4 A.5
5 A.2
6 A.5.1
7 A.5.2
8 A.5.10
9 A.5.10.1
10 A.5.3
执行通用
SELECT NAME FROM table_name ORDER BY 1
会产生:A.1
A.2
A.3
A.4
A.5
A.5.1
A.5.10
A.5.10.1
A.5.2
A.5.3
当这些部分的数字大于9时,我希望它能够正确排序,如下所示:
A.1
A.2
A.3
A.4
A.5
A.5.1
A.5.2
A.5.3
A.5.10
A.5.10.1
我有比这更多的数字条目,它们的长度各不相同,许多段的数字段大于10。我试图在order by子句中弄混regexp_replace(),但是没有运气。任何帮助将不胜感激。
最佳答案
试试这个
WITH t AS
(
SELECT id,name,
xmltype('<r><c>' ||replace(NAME, '.', '</c><c>')||'</c></r>') AS xmlname
FROM table1
)
SELECT name ,id
FROM t
ORDER BY lpad(extract(xmlname,'//c[1]/text()').getstringval(), 5, '0')
||lpad(extract(xmlname,'//c[2]/text()').getstringval(), 5, '0')
||lpad(extract(xmlname,'//c[3]/text()').getstringval(), 5, '0')
||lpad(extract(xmlname,'//c[4]/text()').getstringval(), 5, '0')
Here是一个 fiddle
关于sql - Oracle 10g SQL排序VARCHAR2,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12570026/