powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сортировка поля, созданного по NUMERIC-SORT=1, при наличии лидир. пробелов в данных
10 сообщений из 10, страница 1 из 1
Сортировка поля, созданного по NUMERIC-SORT=1, при наличии лидир. пробелов в данных
    #38639208
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Создаю user-defined коллейт для сортировки строк с цифирками "как чисел".
Создаю затем домен на основе этого коллейта и таблицу.
В таблицу пишу строки-числа, но добавляю лидирующие пробелы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create collation nums_coll for utf8 from unicode case insensitive 'NUMERIC-SORT=1';
create domain dm_nums as varchar(20) character set utf8 not null collate nums_coll;

recreate table ttt(id int primary key, s dm_nums);
delete from ttt;
insert into ttt values(101, rpad('',9,' ') || '9' );
insert into ttt values(102, rpad('',8,' ') || '88' );
insert into ttt values(103, rpad('',7,' ') || '1' );
insert into ttt values(104, rpad('',6,' ') || '55' );
insert into ttt values(105, rpad('',5,' ') || '3' );
commit;

Теперь делаю две выборки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SQL> select * from ttt order by s;

          ID S
============ =====================
         101          9
         102         88
         103        1
         104       55
         105      3

SQL> select * from ttt order by trim(s);

          ID S
============ ===========================
         103        1
         105      3
         101          9
         104       55
         102         88

Я правильно понимаю, что атрибут 'NUMERIC-SORT=1' недостаточен для сортировки строк как чисел, если в них есть лидирующие пробелы, и надо добавлять trim() ?
(проверял на 2.5 и 3.0 - результат одинаковый, как показан выше)
...
Рейтинг: 0 / 0
Сортировка поля, созданного по NUMERIC-SORT=1, при наличии лидир. пробелов в данных
    #38639375
Фотография TPAKTOPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

Сталкивался, trim() надо делать. Лучше всего - ещё на входе.
...
Рейтинг: 0 / 0
Сортировка поля, созданного по NUMERIC-SORT=1, при наличии лидир. пробелов в данных
    #38639381
Фотография TPAKTOPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если тебе ОЧЕНЬ нужно иметь пробелы перед цифрами, можеш их держать в отделном поле и склеивать
Код: sql
1.
 select  probels || s from ttt order by s


или вообще, записывать как integer, в отдельном поле количество пробелов тоже как интегер. На выходе или на клиенте конвертировать в текст.
...
Рейтинг: 0 / 0
Сортировка поля, созданного по NUMERIC-SORT=1, при наличии лидир. пробелов в данных
    #38639393
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

просто интересно стало что с явным преобразованием, вот что получилось

Код: sql
1.
select * from ttt order by cast(s as integer);


План
PLAN SORT ((TTT NATURAL))

------ Performance info ------
Prepare time = 0ms
Execute time = 0ms
Avg fetch time = 0.00 ms
Current memory = 3 285 328
Max memory = 4 393 160
Memory buffers = 256
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 26

Код: sql
1.
select * from ttt order by trim(s);


План
PLAN SORT ((TTT NATURAL))

------ Performance info ------
Prepare time = 0ms
Execute time = 0ms
Avg fetch time = 0.00 ms
Current memory = 3 285 072
Max memory = 4 393 160
Memory buffers = 256
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 26
...
Рейтинг: 0 / 0
Сортировка поля, созданного по NUMERIC-SORT=1, при наличии лидир. пробелов в данных
    #38639416
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на 100 000 записей

Код: sql
1.
select * from ttt order by cast(s as numeric);


План
PLAN SORT ((TTT NATURAL))

------ Performance info ------
Prepare time = 0ms
Execute time = 27s 363ms
Avg fetch time = 1 140.13 ms
Current memory = 13 015 312
Max memory = 16 957 204
Memory buffers = 256
Reads from disk to cache = 13 202
Writes from cache to disk = 12 643
Fetches from cache = 1 105 588

Код: sql
1.
select * from ttt order by trim(s);


План
PLAN SORT ((TTT NATURAL))

------ Performance info ------
Prepare time = 15ms
Execute time = 37s 144ms
Avg fetch time = 1 547.67 ms
Current memory = 16 106 780
Max memory = 16 957 204
Memory buffers = 256
Reads from disk to cache = 15 978
Writes from cache to disk = 15 083
Fetches from cache = 1 105 202

к чему это всё, я сам не знаю, просто времени свободного много
...
Рейтинг: 0 / 0
Сортировка поля, созданного по NUMERIC-SORT=1, при наличии лидир. пробелов в данных
    #38639436
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм...
поставлю пробелы впереди пожалуй.
...
Рейтинг: 0 / 0
Сортировка поля, созданного по NUMERIC-SORT=1, при наличии лидир. пробелов в данных
    #38639446
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поставил
Код: sql
1.
2.
3.
update ttt
set ttt.s = lpad(ttt.s,  20, ' ');
commit;



итоги

Код: sql
1.
select * from ttt order by trim(s);


План
PLAN SORT ((TTT NATURAL))

------ Performance info ------
Prepare time = 0ms
Execute time = 764ms
Avg fetch time = 31.83 ms
Current memory = 16 839 944
Max memory = 16 973 048
Memory buffers = 256
Reads from disk to cache = 1 261
Writes from cache to disk = 992
Fetches from cache = 861 722

Код: sql
1.
select * from ttt order by cast(s as numeric);


План
PLAN SORT ((TTT NATURAL))

------ Performance info ------
Prepare time = 0ms
Execute time = 842ms
Avg fetch time = 35.08 ms
Current memory = 14 757 680
Max memory = 17 211 112
Memory buffers = 256
Reads from disk to cache = 2 968
Writes from cache to disk = 1 897
Fetches from cache = 882 930
...
Рейтинг: 0 / 0
Сортировка поля, созданного по NUMERIC-SORT=1, при наличии лидир. пробелов в данных
    #38639459
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
удивило время выполнения с пробелами и без пробелов.

после генерации сделал холостой апдейт
Код: sql
1.
2.
3.
update ttt
set ttt.s = ttt.s;
commit;


время стало одного порядка.

поясните, господа знатоки, в чём дело.
...
Рейтинг: 0 / 0
Сортировка поля, созданного по NUMERIC-SORT=1, при наличии лидир. пробелов в данных
    #38639512
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadsterпоясните, господа знатоки, в чём дело.В апдейтах и сборке мусора селектами после них.
См. на наличие и кол-во writes
...
Рейтинг: 0 / 0
Сортировка поля, созданного по NUMERIC-SORT=1, при наличии лидир. пробелов в данных
    #38639516
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladВ апдейтах и сборке мусора селектами после них.
См. на наличие и кол-во writesспасибо, я про сборку мусора и подумал, но решил уточнить на всякий.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сортировка поля, созданного по NUMERIC-SORT=1, при наличии лидир. пробелов в данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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