powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / сложная сортировка в order by
7 сообщений из 7, страница 1 из 1
сложная сортировка в order by
    #38919753
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем добра!
у меня тут есть каталог товаров, у каждого товара есть артикул, поле art . он выглядит примерно так 'S 147 C1', тип character(15) NOT NULL

мне нужно отсортировать так, чтобы и по буквам и по цифрам было. то есть
Код: sql
1.
2.
3.
4.
5.
6.
7.
'S 10'
'S 140'
'S 147 A'
'S 147 C1'
'S 147 C2'
'S 147 C10'
'S 1000'



я пробовал
Код: sql
1.
order by NULLIF(regexp_replace(art, E'\\D+(\\d+).*', '\\1', 'g'), '')::int



но это сортирует только во первому числу, а нужно по двум и по буквам :(
одно время артикул начинася с цифр, но сейчас все вроде начинаются с букв. еще есть вида [A-Z]+\.[0-9]+

как мне так отсортировать?
...
Рейтинг: 0 / 0
сложная сортировка в order by
    #38919760
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_black,

попробуйте

Код: sql
1.
order by mid(art,1,instr(art," ")) , val(mid(art,instr(art," ")) ,art
...
Рейтинг: 0 / 0
сложная сортировка в order by
    #38919770
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЕНСИОНЕРКА,

хм.. там с двойными ковычками пишет что
Код: sql
1.
колонка " " не существует


а с одинарыми пишет
Код: sql
1.
функция instr(character, unknown) не существует

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

я вот переделал немного на постгресный синтаксис :) но он мне сказал, что никакого val не существует. оно там зачем было?

Код: sql
1.
select id, art from elements where collection=165 order by substring(art,1,position(' ' in art)) , substring(art,position(' ' in art)) ,art;



код

Код: sql
1.
select id, art from elements where collection=165 order by substring(art,1,position(' ' in art)) , cast(substring(art,position(' ' in art)) as integer) ,art;

не работает, говорит

Код: sql
1.
ОШИБКА:  неверное значение для целого числа: " 803 A"
...
Рейтинг: 0 / 0
сложная сортировка в order by
    #38919774
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
странно, та же проблема с

Код: sql
1.
select id, art from elements where collection=165 order by substring(art,1,position(' ' in art)) , cast(substring(art,position(' ' in art),position(' ' in art)) as integer) ,art;



S 1000 и S 1000 M стоят перед S 115 C1

ПЕНСИОНЕРКА, спасибо за наводку
...
Рейтинг: 0 / 0
сложная сортировка в order by
    #38919788
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_black,

я вам и давала наводку(из аксесс)
с постгресс никогда не работала
...
Рейтинг: 0 / 0
сложная сортировка в order by
    #38919841
йоксель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в лоб

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH test (f ) AS
(values
('S 10')
,('S 140')
,('S 147 A')
,('S 147 C1')
,('S 147 C2')
,('S 147 C10')
,('S 1000')
)
,split (f,arr) AS (SELECT f, regexp_split_to_array(f,E'\\s+') AS arr  FROM test)
SELECT f,arr,arr[1] AS "1" ,arr[2]::int AS "2",regexp_replace(arr[3],'\d','','ig')  ,(NULLIF(regexp_replace(arr[3],'[[:alpha:]]','','ig'),''))::int
FROM split
ORDER BY 3,4,5,6



или можно сразу регуляризнуть примерно так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
WITH test (f ) AS
(values
('S 10')
,('S 140')
,('S 147 A')
,('S 147 C1')
,('S 147 C2')
,('S 147 C10')
,('S 1000')
)
, split AS (SELECT f, regexp_split_to_array(regexp_replace(f,E'([[:alpha:]])(\\d+)','\1 \2','ig' ),E'\\s+') AS arr  FROM test)
SELECT * FROM split ORDER BY arr[1],arr[2]::int ,arr[3], arr[4]::int

чтобы особые случаи не рассматривать
...
Рейтинг: 0 / 0
сложная сортировка в order by
    #38924346
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackно это сортирует только во первому числу, а нужно по двум и по буквам :(
одно время артикул начинася с цифр, но сейчас все вроде начинаются с букв. еще есть вида [A-Z]+\.[0-9]+

как мне так отсортировать?

Вообще стандартное решение таких проблем в любой СУБД --

Код: sql
1.
ORDER BY case when x1 = 'y1' then 1 when x1 = 'y2' then 2 else 2000 end



Таким макаром можно задавать вообще любую сортировку.
Можно CASE каскадировать (вкладывать друг в друга). Можно ранжировать (несколько выражений в ORDER BY).
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / сложная сортировка в order by
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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