Another possible approach is using regular expressions.
Here is an example how to parse a string and divide in into subfields:
select col,
regexp_replace( col, '\D+\s+(\d+).*','\1') As field1,
regexp_replace( col, '\D+\s+\d+(\D*),*.*','\1') As field2,
regexp_replace( col, '\D+\s+\d+\D*,*(\d*)','\1') As field3
from table1
ORDER BY field1, field2, field3
;
If only a sort is required, then use these functions in ORDER BY clause:
select * from table1
order by
regexp_replace( col, '\D+\s+(\d+).*','\1'),
regexp_replace( col, '\D+\s+\d+(\D*),*.*','\1'),
regexp_replace( col, '\D+\s+\d+\D*,*(\d*)','\1')
Demo: http://sqlfiddle.com/#!4/8f289/4
But for large dataset this will be horrible slow.
You need to normalize data in the table - parse it during insertion and store each field in separate column in the table, then create an index on these columns.
A sort using a cast to numeric:
select col,
cast( regexp_replace( col, '\D+\s+(\d+).*','\1') as numeric) As field1,
regexp_replace( col, '\D+\s+\d+(\D*),*.*','\1') As field2,
cast( regexp_replace( col, '\D+\s+\d+\D*,*(\d*)','\1') As numeric) As field3
from table1
ORDER BY field1, field2, field3
;
select * from table1
order by
cast( regexp_replace( col, '\D+\s+(\d+).*','\1') as numeric),
regexp_replace( col, '\D+\s+\d+(\D*),*.*','\1'),
cast( regexp_replace( col, '\D+\s+\d+\D*,*(\d*)','\1') As numeric)