这是非常残酷的,可能无法使用。看起来嵌套表可能会对该列执行您想要的操作。下面的示例使用一些内置的 xml 实用程序将列分开并重新组合:
- 使用 REPLACE 和一些连接将列更改为 xml 字符串
- 使用 xmlsequence 从 xml 字符串中构建一个 xmltype 以从 xmltype 中提取元素并将它们视为行
- 使用 8 位数字格式转换这些行值中的每一个(将此掩码扩展为最大宽度数)
- 反转将行连接在一起的过程(sort_string)
- 基于填充数字的顺序
我把它和一堆剪切和粘贴放在一起:
http://askankit.blogspot.ca/2009/04/use-xmlagg-in-oracle-to-concat-multiple.html
https://forums.oracle.com/message/9408528
CREATE TABLE my_table(mycol varchar2(1024));
insert into my_table values('1009-25-7-7-1-7-22-5-7');
insert into my_table values('1009-25-7-7-1-7-22-5-9');
insert into my_table values('1001-2-53');
insert into my_table values('1001-2-53-57');
insert into my_table values('1001-2-53-72');
insert into my_table values('1001-2-53-76');
insert into my_table values('1001-2-53-88');
insert into my_table values('1001-2-53-13');
insert into my_table values('1001-2-53-17');
insert into my_table values('1001-2-53-25');
insert into my_table values('10');
insert into my_table values('2');
询问:
SELECT mycol, sort_string
FROM (
SELECT mycol
,SUBSTR(REPLACE(REPLACE(XMLAGG(XMLELEMENT("x", x) ORDER BY seq)
,'</x>'
)
,'<x>'
,'|'
)
,2 ) AS sort_string
FROM ( SELECT m.mycol
,TO_CHAR(EXTRACTVALUE(column_value,'inner'), '09999999') AS x
,ROWNUM AS seq
FROM my_table m
,TABLE(xmlsequence(xmltype(
'<outer>' ||
'<inner>' || REPLACE(mycol,'-','</inner><inner>') || '</inner>' ||
'</outer>'
).EXTRACT('outer/*')))
)
GROUP BY mycol
) ORDER BY sort_string
结果:
| MYCOL | SORT_STRING |
|------------------------|-------------------------------------------------------------------------------------------|
| 2 | 00000002 |
| 10 | 00000010 |
| 1001-2-53 | 00001001| 00000002| 00000053 |
| 1001-2-53-13 | 00001001| 00000002| 00000053| 00000013 |
| 1001-2-53-17 | 00001001| 00000002| 00000053| 00000017 |
| 1001-2-53-25 | 00001001| 00000002| 00000053| 00000025 |
| 1001-2-53-57 | 00001001| 00000002| 00000053| 00000057 |
| 1001-2-53-72 | 00001001| 00000002| 00000053| 00000072 |
| 1001-2-53-76 | 00001001| 00000002| 00000053| 00000076 |
| 1001-2-53-88 | 00001001| 00000002| 00000053| 00000088 |
| 1009-25-7-7-1-7-22-5-7 | 00001009| 00000025| 00000007| 00000007| 00000001| 00000007| 00000022| 00000005| 00000007 |
| 1009-25-7-7-1-7-22-5-9 | 00001009| 00000025| 00000007| 00000007| 00000001| 00000007| 00000022| 00000005| 00000009 |