powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сортировка строк как числа и строки
15 сообщений из 15, страница 1 из 1
Сортировка строк как числа и строки
    #39533437
ponikrf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно есть проблема с postgresql

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

Собственно задача отсортировать правильно это все дело.

На данный момент orderBy сортирует так

5
51
52
57
6
63
68

Хотелось бы что бы он сортировал последовательно.

Усложняется все тем что в этом поле могут быть и слова и цифры.

В Mysql помогало приобразование типов, что то типа (place_name+000)

С Postgres такое не прокатит. Хотелось бы узнать, может есть какой то хак или костыль который бы позвоял правильно сортирова?
...
Рейтинг: 0 / 0
Сортировка строк как числа и строки
    #39533447
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ponikrfСобственно есть проблема с postgresql

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

Собственно задача отсортировать правильно это все дело.

На данный момент orderBy сортирует так

5
51
52
57
6
63
68

Хотелось бы что бы он сортировал последовательно.

Усложняется все тем что в этом поле могут быть и слова и цифры.

В Mysql помогало приобразование типов, что то типа (place_name+000)

С Postgres такое не прокатит. Хотелось бы узнать, может есть какой то хак или костыль который бы позвоял правильно сортирова?


какое "всё это дело", если у вас в поле хранятся названия улиц?
...
Рейтинг: 0 / 0
Сортировка строк как числа и строки
    #39533491
ponikrf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как я уже писал выше. Название домов квартир и улиц.

На данный момент сделал сортировку на PHP с помощью функции natcasesort с алгоритмом

Но я до сих пор надеюсь что это можно сделать средствами postgres хотя почитав так пока ничего интересного не нашел
...
Рейтинг: 0 / 0
Сортировка строк как числа и строки
    #39533500
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ponikrf,

Т.е. у вас храниться в поле набор из текстов и чисел без явной структуры, но вы хотите, чтобы оно сортировалось… как? По каким-то числам внутри строки?
...
Рейтинг: 0 / 0
Сортировка строк как числа и строки
    #39533520
ponikrf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
natural ordering вот что я хочу от postgres. Но как я понял postgres может это сделать только с расширением.
...
Рейтинг: 0 / 0
Сортировка строк как числа и строки
    #39533528
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно попробовать решить как нибудь так (пока только мысли):
нарезать на части по спецсимволам (например пробел, "/", "," ".")
+добавить к каждой части вхождения номер по порядку
например "Астрономическая 5/19" = "Астрономическая" - 1, "5" - 2, "19" - 3
"Академика Глушко 10" = "Академика" - 1, "Глушко" - 2, "10" - 3

потом сделать тройную сортировку:
level, (если isnumeric(path) то path::numeric else null::numeric end), (если not isnumeric(path) то path else null::text end)

тогда может есть шанс что будет так:
Академика Глушка 10
Арбузова 15
Астрономическая 3
Астрономическая 5/2
Астрономическая 5/19
Астрономическая 5/20
Астрономическая 7

и тд
...
Рейтинг: 0 / 0
Сортировка строк как числа и строки
    #39533536
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushkaможно попробовать решить как нибудь так (пока только мысли):
нарезать на части по спецсимволам (например пробел, "/", "," ".")
+добавить к каждой части вхождения номер по порядку
например "Астрономическая 5/19" = "Астрономическая" - 1, "5" - 2, "19" - 3
"Академика Глушко 10" = "Академика" - 1, "Глушко" - 2, "10" - 3

потом сделать тройную сортировку:
level, (если isnumeric(path) то path::numeric else null::numeric end), (если not isnumeric(path) то path else null::text end)

тогда может есть шанс что будет так:
Академика Глушка 10
Арбузова 15
Астрономическая 3
Астрономическая 5/2
Астрономическая 5/19
Астрономическая 5/20
Астрономическая 7

и тд


ТС так и не привел примеров своих записей.
А исходя из наших предположений, например так:

Астрономическая 3
Астрономическая 5/2
Астрономическая д7/2
Астрономическая д7/ корп.2
Астрономическая д7, корп 2
...
и пошло-поехало, насколько хватит фантазии у операторов, вводивших данные.
...
Рейтинг: 0 / 0
Сортировка строк как числа и строки
    #39533544
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавить стоп слова (д, дом, ул, улица итп (но может совпасть что например улица это реальное название улицы например "Широкая улица" но мы же это только для сортировки)

да и к спец символам добавить еще "-"
...
Рейтинг: 0 / 0
Сортировка строк как числа и строки
    #39533548
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще было бы неплохо предварительно связку буква+цифра заменить на буква + пробел + цифра)
...
Рейтинг: 0 / 0
Сортировка строк как числа и строки
    #39533629
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а может по этому направлению пойти: тупо любое распознанное ЧИСЛО в тексте заменить на (1000000+ЧИСЛО)::text
и сортануть по полученному выражению, длина символов числа будет фиксированной
1000005
1000051
1000052
1000057
1000006
1000063
1000068

и тогда в моем примере будет так:

Академика Глушко 1000010
Арбузова 1000015
Астрономическая 1000003
Астрономическая 1000005/1000002
Астрономическая 1000005/1000019
Астрономическая 1000005/1000020
Астрономическая 1000007

+ отдельно прикрутить логику вырезания всяких "д" "д." и тп
...
Рейтинг: 0 / 0
Сортировка строк как числа и строки
    #39533648
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупиннасколько хватит фантазиичем больше фантазия операторов, тем менее целесообразно усложнять алгоритм. Для первочисельных строк достаточно:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with t(s) as (values
('Астрономическая 3'),
('Астрономическая 5/2'),
('Астрономическая д7/2'))
select s,  regexp_replace(s, 'д?\d+', lpad(substring(s from '\d+'), 10, '0')) from t;

             s              |           regexp_replace
----------------------------+------------------------------------
 Астрономическая 3          | Астрономическая 0000000003
 Астрономическая 5/2        | Астрономическая 0000000005/2
 Астрономическая д7/2       | Астрономическая 0000000007/2


А далее можно додумывать адреса типа "10я линия 474го проезда 9го микрорайона имени 26 Бакинских комиссаров, корпус 815".
...
Рейтинг: 0 / 0
Сортировка строк как числа и строки
    #39533726
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.,

тут скока не выдумывай -- жисть богачее и богачей
надо пополнять табличку
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
with /* --TO DO--
vartokens (tok ,regexp) as (values 
 ('дом','(дом|д.|д)' 	)
,('строение',....	)
,(.....			)
) ---=> regexp_match ((A)|(!A))...
,--*/
t(s) as (SELECT * FROM unnest(string_to_array(
$$
Астрономическая 13
Астрономическая 5/2
Астрономическая д7/2
10я линия 474го проезда 9го микрорайона имени 26 Бакинских комиссаров, корпус 815
9я линия 474го проезда 10го микрорайона имени 26 Бакинских комиссаров, корпус 815
$$,E'\n')) u
where  u <>''
)
select s 
 ,(SELECT 
	string_agg(regexp_replace( u
				,'((д|/|стр|корпус|корп|к)[\. ]?)?(\d+)'
				,lpad(substring(u from '\d+'),5, '0')
				, 'i')
			,'' order by o) as backward_ 
		
		FROM unnest(string_to_array(
				regexp_replace( s
					,'(?<=(\d))(?!(\d))'
					,E'\n.','ig'),E'\n')) with ordinality
						AS forward_ (u,o)
	) ts
from t order by 2;

...
Рейтинг: 0 / 0
Сортировка строк как числа и строки
    #39533729
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

откуда мораль -- не хватает обобщения скалярных операций и функций на массивы . просто для удобства.

Код: plaintext
~ F(ARRAY[a1...,an])==ARRAY[F(a1)...,F(an)] 
-- кактотаг (что смешно -- легко должно деится)

(а там и агрегаты массивов в смысле аппендов набегеют)

но ?"главное" -- сетовых переменных нет, неудобно сетами пулятся.
...
Рейтинг: 0 / 0
Сортировка строк как числа и строки
    #39533917
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нагуглился экстеншн https://pgxn.org/dist/pg_natural_sort_order/
...
Рейтинг: 0 / 0
Сортировка строк как числа и строки
    #39534019
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqне хватает обобщения скалярных операций и функций на массивыДля одного array-аргумента на выражение хватает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
96=> select array(select unnest(array[1,2,3])+10);
   array
------------
 {11,12,13}

96=> select array(select power(2, unnest(array[1,2,3])));
  array
---------
 {2,4,8}



В более сложных выражениях не всегда можно обойтись однократным употреблением array-аргумента и без подзапросов уже не обойтись:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
96=> with t(s) as (select 'aa 12, bb №345, cc. 6'::text)
select string_agg(concat(lpad(nullif(a[1], ''), 10, '0'), a[2]), '')
from (
    select regexp_matches(s, '(^|\d+)(\D+|$)', 'g') a
    from t
) t1;

                  string_agg
-----------------------------------------------
 aa 0000000012, bb №0000000345, cc. 0000000006


Еще бывает необходимость инкрементального применения операций - это уже через рекурсию.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сортировка строк как числа и строки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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