Согласен с
Anton Kuzmichev, однако если нет возможности изменить структуру данных, то можно разбить строку на массив и сортировать по каждому элементу
create table test (
col varchar(64)
);
insert into test
values
('ЧС.1.1'),
('ЧС.1.2'),
('ЧС.1.3.1'),
('ЧС.1.10'),
('ЧС.1.11.1'),
('П.1.1'),
('П.1.2'),
('П.10.2'),
('П.2.10');
select
col
from
test
order by
(string_to_array(col, '.'))[1],
(string_to_array(col, '.'))[2]::int,
(string_to_array(col, '.'))[3]::int;
PostgreSQL fiddle
или так:
select col from (
select
col, string_to_array(col, '.') arr
from
test
) tbl
order by
arr[1],
arr[2]::int,
arr[3]::int;