powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Грамотная сортировка
11 сообщений из 11, страница 1 из 1
Грамотная сортировка
    #40028614
Erebus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет
Есть запрос типа
Код: sql
1.
2.
3.
4.
5.
SELECT table1.num AS num, table2.sum
FROM table1
LEFT JOIN table2
ON (table2.id = table1.fkid)
ORDER BY num



Поле 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

Кто-нибудь может подсказать как грамотно написать запрос, чтобы сортировка была как требуется?
...
Рейтинг: 0 / 0
Грамотная сортировка
    #40028645
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Erebus,

если значения валидные числа, тогда плясать от ORDER BY cast(num as integer)
...
Рейтинг: 0 / 0
Грамотная сортировка
    #40028656
Erebus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VSVLAD, попытался поплясать, танцы быстро закончились. Попробовал ORDER BY CAST(num AS Float), выводит те же самые значения
...
Рейтинг: 0 / 0
Грамотная сортировка
    #40028659
Erebus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VSVLAD, а возможно ли как-то с text работать? Чтобы text сортировать без кастинга
...
Рейтинг: 0 / 0
Грамотная сортировка
    #40028753
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Erebus,

точно float или real (у нас же дробные числа).

>> Чтобы text сортировать без кастинга
Можно, но это делается гораздо сложнее. Надо создать свой Collation, в котором реализовать правила сортировки. В разных ЯП это делается по разному, всё зависит от той библиотеки, которая работает с SQLite.

Если таблицы огромные, то кастование может влиять на скорость, в противном случае это решение очень даже неплохое. Если вместо дробных чисел, появятся такие значения 1.1.1, 1.1.2 и т.д. и сложнее, то тут придётся конечно collation свой выдумывать. Либо отдать сортировку на клиентское приложение
...
Рейтинг: 0 / 0
Грамотная сортировка
    #40028773
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все верно: 1.11 больше 1.1 и меньше 1.2, хоть в text, хоть в Float.

Надо либо делить на несколько полей
num1num2text11...12...111...
либо нолики дописать недостающие
numtext1.01...1.02...1.11...
...
Рейтинг: 0 / 0
Грамотная сортировка
    #40028853
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select field1 from test1 
order by 
case   
when instr(field1, '.')=0 then cast(field1 as integer)
else cast(substr(field1, 0, instr(field1, '.')) as integer)
end,
case   
when instr(field1, '.')=0 then 0
else cast(substr(field1, instr(field1, '.')+1) as integer)
end
...
Рейтинг: 0 / 0
Грамотная сортировка
    #40028969
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Erebus

Поле num типа text и оно имеет значения для примера (1, 1.1, 1.10, 1.11, 1.2, 1.3 и т.д.). При сортировке вывод значений идет следующий
1,
1.1,
1.10,
1.11,
1.2
и т.д.
[зануда mode on] В SQLite нет типов данных [зануда mode off]
Это означает, что если в поле типа text послать строку "1.1" то SQLite сам сконвертирует его в real и будет хранить как real. И сортировать по этому полю будет - сначала все integer и real, потом текст.
Читать тут, до просветления: https://sqlite.org/datatype3.html

Однако! если у тебя винда стоит русская и с русской локалью по умолчанию, то учитывая что в русской локали десятичная запятая а не точка - автоопределение типа данных может не сработать и "1.1" действительно может определиться как текст. Но если ты перенесешь свое приложение на винду с английской локалью по умолчанию, или не дай бог - андроид какой-нибудь.... Получишь неожиданную автоконвертацию с сопутствующими фейрверками.

Резюме: Если table1.num это текстовая многоуровневая нумерация - подумай над тем чтобы разбить ее на несколько полей, например:
Код: sql
1.
2.
3.
4.
5.
6.
create table1 (
   chapter integer,
   subchapter integer,
   subsubchapter integer,
   chapter_text text
)

Ну а сколько будет "sub...sub" полей - зависит от какой глубины у тебя может быть нумерация.

Другой вариант - храни нумерацию в виде разреженного" текста. Например " 1. 1" или (чтобы не пугаться пробелов) "0001.0001", "[vol 01] chapter 001", и тд. Насколько фантазии хватит.
...
Рейтинг: 0 / 0
Грамотная сортировка
    #40031850
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Можно тупо добавить столбец в котором ставить числа для сортировки

Val Sort1 101.1 201.10401.11501.2 30
...
Рейтинг: 0 / 0
Грамотная сортировка
    #40031910
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2
1.2 30

тут видимо 60 должно быть или как?
...
Рейтинг: 0 / 0
Грамотная сортировка
    #40032425
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
VSVLAD
Cat2
1.2 30

тут видимо 60 должно быть или как?

По задаче автора топика 1.10 больше чем 1.2
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Грамотная сортировка
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]