订购由Space分隔的String列

时间:2015-02-15 19:09:31

标签: sql oracle11g toad

名为ASORT的表具有以下定义和插入(按指定顺序):

CREATE TABLE asort(a NUMBER, b VARCHAR2(5));

INSERT INTO asort VALUES(1, '1 11'); 
INSERT INTO asort VALUES(2, '11');
INSERT INTO asort VALUES(3, '1 10');
INSERT INTO asort VALUES(4, '1 3');
INSERT INTO asort VALUES(5, '1 5');
INSERT INTO asort VALUES(6, '1 20');
INSERT INTO asort VALUES(7, '1 14');
INSERT INTO asort VALUES(8, '1');

SELECT * 
FROM asort 
ORDER BY b; -- returns the below result

enter image description here

但是所需的顺序是空格后面的所有数字也应如下所示排序。

enter image description here

请建议查询以获得所需的结果。

谢谢.. !!

1 个答案:

答案 0 :(得分:2)

您可以使用regexp_substr()从分隔列表中提取第n个元素。然后,您可以将这些值转换为数字并按此顺序排序。类似的东西:

ORDER BY cast(replace(regexp_substr(b||' ', '[0-9]+ ', 1, 1), ' ', '') as int) NULLS FIRST,
         cast(replace(regexp_substr(b||' ', '[0-9]+ ', 1, 2), ' ', '') as int)

Here是一个SQL小提琴。