Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сортировка строк как числа и строки / 15 сообщений из 15, страница 1 из 1
09.10.2017, 14:26
    #39533437
ponikrf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка строк как числа и строки
Собственно есть проблема с postgresql

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

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

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

5
51
52
57
6
63
68

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

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

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

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

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

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

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

5
51
52
57
6
63
68

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

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

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

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


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

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

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

Т.е. у вас храниться в поле набор из текстов и чисел без явной структуры, но вы хотите, чтобы оно сортировалось… как? По каким-то числам внутри строки?
...
Рейтинг: 0 / 0
09.10.2017, 16:08
    #39533520
ponikrf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка строк как числа и строки
natural ordering вот что я хочу от postgres. Но как я понял postgres может это сделать только с расширением.
...
Рейтинг: 0 / 0
09.10.2017, 16:16
    #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
09.10.2017, 16:23
    #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
09.10.2017, 16:29
    #39533544
Legushka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка строк как числа и строки
добавить стоп слова (д, дом, ул, улица итп (но может совпасть что например улица это реальное название улицы например "Широкая улица" но мы же это только для сортировки)

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

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

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

+ отдельно прикрутить логику вырезания всяких "д" "д." и тп
...
Рейтинг: 0 / 0
09.10.2017, 19:16
    #39533648
p2.
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
10.10.2017, 00:14
    #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
10.10.2017, 00:26
    #39533729
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка строк как числа и строки
qwwq,

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

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

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

но ?"главное" -- сетовых переменных нет, неудобно сетами пулятся.
...
Рейтинг: 0 / 0
10.10.2017, 11:29
    #39533917
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка строк как числа и строки
нагуглился экстеншн https://pgxn.org/dist/pg_natural_sort_order/
...
Рейтинг: 0 / 0
10.10.2017, 13:30
    #39534019
p2.
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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сортировка строк как числа и строки / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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