|
Грамотная сортировка
|
|||
---|---|---|---|
#18+
Всем привет Есть запрос типа Код: sql 1. 2. 3. 4. 5.
Поле num типа text и оно имеет значения для примера (1, 1.1, 1.10, 1.11, 1.2, 1.3 и т.д.). При сортировке вывод значений идет следующий 1, 1.1, 1.10, 1.11, 1.2 и т.д. а требуется 1, 1.1, 1.2, 1.3, 1.10 1.11 Кто-нибудь может подсказать как грамотно написать запрос, чтобы сортировка была как требуется? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2020, 10:14 |
|
Грамотная сортировка
|
|||
---|---|---|---|
#18+
Erebus, если значения валидные числа, тогда плясать от ORDER BY cast(num as integer) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2020, 11:34 |
|
Грамотная сортировка
|
|||
---|---|---|---|
#18+
VSVLAD, попытался поплясать, танцы быстро закончились. Попробовал ORDER BY CAST(num AS Float), выводит те же самые значения ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2020, 11:56 |
|
Грамотная сортировка
|
|||
---|---|---|---|
#18+
VSVLAD, а возможно ли как-то с text работать? Чтобы text сортировать без кастинга ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2020, 12:00 |
|
Грамотная сортировка
|
|||
---|---|---|---|
#18+
Erebus, точно float или real (у нас же дробные числа). >> Чтобы text сортировать без кастинга Можно, но это делается гораздо сложнее. Надо создать свой Collation, в котором реализовать правила сортировки. В разных ЯП это делается по разному, всё зависит от той библиотеки, которая работает с SQLite. Если таблицы огромные, то кастование может влиять на скорость, в противном случае это решение очень даже неплохое. Если вместо дробных чисел, появятся такие значения 1.1.1, 1.1.2 и т.д. и сложнее, то тут придётся конечно collation свой выдумывать. Либо отдать сортировку на клиентское приложение ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2020, 15:11 |
|
Грамотная сортировка
|
|||
---|---|---|---|
#18+
Все верно: 1.11 больше 1.1 и меньше 1.2, хоть в text, хоть в Float. Надо либо делить на несколько полей num1num2text11...12...111... либо нолики дописать недостающие numtext1.01...1.02...1.11... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2020, 15:30 |
|
Грамотная сортировка
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2020, 17:35 |
|
Грамотная сортировка
|
|||
---|---|---|---|
#18+
Erebus Поле num типа text и оно имеет значения для примера (1, 1.1, 1.10, 1.11, 1.2, 1.3 и т.д.). При сортировке вывод значений идет следующий 1, 1.1, 1.10, 1.11, 1.2 и т.д. Это означает, что если в поле типа text послать строку "1.1" то SQLite сам сконвертирует его в real и будет хранить как real. И сортировать по этому полю будет - сначала все integer и real, потом текст. Читать тут, до просветления: https://sqlite.org/datatype3.html Однако! если у тебя винда стоит русская и с русской локалью по умолчанию, то учитывая что в русской локали десятичная запятая а не точка - автоопределение типа данных может не сработать и "1.1" действительно может определиться как текст. Но если ты перенесешь свое приложение на винду с английской локалью по умолчанию, или не дай бог - андроид какой-нибудь.... Получишь неожиданную автоконвертацию с сопутствующими фейрверками. Резюме: Если table1.num это текстовая многоуровневая нумерация - подумай над тем чтобы разбить ее на несколько полей, например: Код: sql 1. 2. 3. 4. 5. 6.
Ну а сколько будет "sub...sub" полей - зависит от какой глубины у тебя может быть нумерация. Другой вариант - храни нумерацию в виде разреженного" текста. Например " 1. 1" или (чтобы не пугаться пробелов) "0001.0001", "[vol 01] chapter 001", и тд. Насколько фантазии хватит. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2020, 01:14 |
|
Грамотная сортировка
|
|||
---|---|---|---|
#18+
Можно тупо добавить столбец в котором ставить числа для сортировки Val Sort1 101.1 201.10401.11501.2 30 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2020, 16:34 |
|
Грамотная сортировка
|
|||
---|---|---|---|
#18+
Cat2 1.2 30 тут видимо 60 должно быть или как? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2020, 18:38 |
|
|
Start [/forum/topic.php?fid=54&msg=40028645&tid=2008344]: |
0ms |
get settings: |
31ms |
get forum list: |
9ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
84ms |
get topic data: |
17ms |
get forum data: |
5ms |
get page messages: |
665ms |
get tp. blocked users: |
2ms |
others: | 141ms |
total: | 968ms |
0 / 0 |