Сортировка текстового поля с числами

Здравствуйте!
Не могу решить задачу сортировки, что делаю не так?
В таблице создал текстовое поле в котором я храню "вложенность" в виде "1.2.3.4.14...". Делаю сортировка по этому полю но получаю сортировку текста, а мне нужно другое. Чтобы было понятно, лучше всего подходит пример с оглавлением книги. Т.е у меня таблица с двумя текстовыми полями:
(номер главы или под.главы), (название)
Например так:

table1:
vhodimost, name
-----------------------
1         glava....
10        glava....
10.1      glava....
10.2.3    glava....
1.1       glava....
14.12.13  glava....
2         glava....
4.1       glava....
4         glava....
4.20.3    glava....
4.2.2     glava....
4.2.1     glava....
4.2.3     glava....

Нужно отсортировать и получить нормальное оглавление. Т.е. так

table1:
vhodimost, name
-----------------------
1         glava....
1.1       glava....
2         glava....
4         glava....
4.1       glava....
4.2.1     glava....
4.2.2     glava....
4.2.3     glava....
4.20.3    glava....
10        glava....
10.1      glava....
10.2.3    glava....
14.12.13  glava....

Для поле vhodimost использую тип данных "text" т.к. не знаю в какой ещё тип можно запихнуть числа с таким кол-вом точек. Вложенность в принципе можно ограничить, но хотелось бы иметь ограничение побольше например до 50. Поиском нашёл что иногда используют для иерархии деревья, но с такими вещами ни когда не сталкивался и плохо представляю как это реализовать. Если есть другие способы хотелось бы услышать.
Спасибо.
PostgreSQL 8.4.3

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

А что вы хотите?

Сортируете текстовый тип, значит сортироваться будет путём сравнения СТРОК. Откуда PostgreSQL должен знать, что вы в строку засунули?

Могу посоветовать очень простое решение. Вместе с вашими 1.1.1 заведите ЧИСЛОВОЕ поле, которое будет хранить числа, соответствующие вашим цифрам. Тогда и сортировать можно тупо по этому полю. Непонятно? например:

table1:
vid, vhodimost, name
-----------------------
100 1         glava....
200 10        glava....
300 10.1      glava....
400 10.2.3    glava....

Чтобы потом можно было вставлять значения делайте нумерацию скажем через десять или даже через 100, чтобы уж гарантировано хватило. Даже ренумерацию в этом случае проще сделать, чем заморачиваться.

Есть и другие варианты - пишите свой тип данных, где сравнение будет происходить так как вам надо, но это геморно, разумеется.

Ещё вариант. Напишите функцию, которая будет обрабатывать вашу последовательность вида 1.2.10... так, чтобы получалось число, которое будет правильно указывать место данной главы в иерархии. Тогда все можно свести к запросу вида:

SELECT vhodimost, name, myfunc(vhodimost) AS id ORDER BY id;

где myfunc - имя функции

Спасибо. Первый вариант не

Спасибо.
Первый вариант не подходит.
Второй вариант нравится больше. Вот только поясните, если строчку будут редактировать тогда нужно писать ещё одну функцию или как?

Я уже успел найти, что существуют триггеры на события. Тоже не совсем просто, но вроде выглядит более гибко. В голове вертится триггер который разобьет последовательность, на отдельные числа и вставит каждое число в отдельное поле. Чтобы потом можно было легко сделать сортировку уже по этим полям можно даже вообще с заданным уровнем вложенности. Или это будет бредовый и тормознутый подход?

Вариантов масса

И как правило использование того или иного решения зависит от деталей задачи. Триггер - вполне нормальный подход, не вижу в нём ничего такого.

Кстати вот ещё один вариант в голову пришёл.
Делаете функцию, которая формирует из строки, иерархию. Тогда и поле дополнительное не нужно.
Т.е. например, формат числа по три разряда на уровнь:

строку 001002003 функция должна преобразовать к виду 1.2.3

Тогда в таблице два поля: vhodimost и name, а запрос выглядит так:

SELECT myfunc(vhodimost), name FROM table ORDER BY vhodimost;

Поскольку строки будут в едином формате, то сортировка должна себе работать

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023