powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как развернуть массив в столбец?
5 сообщений из 5, страница 1 из 1
Как развернуть массив в столбец?
    #35314018
Ostrovok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
День добрый.

Есть таблица, один из столбцов которой массив.

Подскажите, плз, кто знает, как "развернуть по вертикали эти записи?
т.е.

из так:
id | ww
--------+-----------
31 | {1,2,3}
32 | {1,2,4}
33 | {1,2,6}

получить так:

ww
---
1
2
3
1
2
4
1
2
6
...
Рейтинг: 0 / 0
Как развернуть массив в столбец?
    #35314883
Stud99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Недавно интересная статья была как раз с таким примером.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create function array_to_set(anyarray) returns setof anyelement language sql as $body$
select $ 1 [i] from generate_series(array_lower($ 1 , 1 ),array_upper($ 1 , 1 )) s(i)
$body$;

select id, array_to_set(w)
from (
  select  1  as id, '{1,2,3}'::int[] as w
  union all select  2 ,'{4,5,6}'
  union all select  3 ,'{7,8,9}'
) a
Вся хитрость в том, что функция должна быть на SQL или C, на других PL-языках такое "размножение" строк не работает.
...
Рейтинг: 0 / 0
Как развернуть массив в столбец?
    #35315033
Ostrovok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.

я надыбал тоже самое решение :)), только отсюда http://www.opennet.ru/base/dev/psql_index_array.txt.html
...
Рейтинг: 0 / 0
Как развернуть массив в столбец?
    #35315200
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если я правильно понимаю, вызов SRF через select-list не документирован со всеми вытекающими последствиями, вплоть до возможности запрета в будущих версиях PG :-(

PS: и уже сейчас чреват, например, таким багом/фичей

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
nalbat=> select * from generate_series( 1 , 2 ) as s1, generate_series( 1 , 4 ) as s2;
 s1 | s2
----+----
   1  |   1 
   1  |   2 
   1  |   3 
   1  |   4 
   2  |   1 
   2  |   2 
   2  |   3 
   2  |   4 
( 8  rows)

nalbat=> select generate_series( 1 , 2 ) as s1, generate_series( 1 , 4 ) as s2;
 s1 | s2
----+----
   1  |   1 
   2  |   2 
   1  |   3 
   2  |   4 
( 4  rows)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
nalbat=> select array_to_set(a), array_to_set(b) from ( select '{1,2}'::int[] as a, '{1,2,3}'::int[] as b ) as ab;
 array_to_set | array_to_set
--------------+--------------
             1  |             1 
             2  |             2 
             1  |             3 
             2  |             1 
             1  |             2 
             2  |             3 
( 6  rows)

nalbat=> select array_to_set(a), array_to_set(b) from ( select '{1,2}'::int[] as a, '{1,2,3,4}'::int[] as b ) as ab;
 array_to_set | array_to_set
--------------+--------------
             1  |             1 
             2  |             2 
             1  |             3 
             2  |             4 
( 4  rows)

PPS: может вместо массива использовать дополнительную таблицу one-to-many?
...
Рейтинг: 0 / 0
Как развернуть массив в столбец?
    #35316667
бухарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно без доп. функций одним запросом (используя generate_series + array_dims)

Код: plaintext
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
CREATE TABLE arr (
    x   integer[]
);
INSERT INTO arr (x)
    VALUES ('{10, 22, 33, 44}');

INSERT INTO arr (x)
    VALUES ('{10, 2, 30, 4,50,6,7,8,9,10,110,12,13,14,15,160,17,18,19,220,21,22,2123}');

SELECT x FROM arr;
SELECT x[ 1 ],x[ 2 ],x[ 3 ],x[ 4 ] FROM ARR;

SELECT array_dims(x)  FROM ARR;


SELECT position(':' in array_dims(x))  FROM ARR;

SELECT position(']' in array_dims(x))  FROM ARR;

SELECT substring(array_dims(x) FROM position(':' in array_dims(x))+ 1  FOR position(']' in array_dims(x))-position(':' in array_dims(x))- 1 ) FROM  ARR;

SELECT CAST(substring(array_dims(x) FROM position(':' in array_dims(x))+ 1  FOR position(']' in array_dims(x))-position(':' in array_dims(x))- 1 ) AS INTEGER) FROM  ARR;


SELECT x AS array_full,
       element_num,
       x[element_num] AS array_val
FROM   (SELECT x,
	       generate_series( 1 ,arrsize) AS element_num
	FROM  (SELECT x,CAST(substring(array_dims(x) FROM position(':' in array_dims(x))+ 1  FOR position(']' in array_dims(x))-position(':' in array_dims(x))- 1 ) AS INTEGER) AS arrsize
	       FROM  ARR
	      )all_array_sizes
       )bzzz;


                              array_full                               | element_num | array_val
-----------------------------------------------------------------------+-------------+----------
 { 10 , 22 , 33 , 44 }                                                         |            1  |         10 
 { 10 , 22 , 33 , 44 }                                                         |            2  |         22 
 { 10 , 22 , 33 , 44 }                                                         |            3  |         33 
 { 10 , 22 , 33 , 44 }                                                         |            4  |         44 
 { 10 , 2 , 30 , 4 , 50 , 6 , 7 , 8 , 9 , 10 , 110 , 12 , 13 , 14 , 15 , 160 , 17 , 18 , 19 , 220 , 21 , 22 , 2123 } |            1  |         10 
 { 10 , 2 , 30 , 4 , 50 , 6 , 7 , 8 , 9 , 10 , 110 , 12 , 13 , 14 , 15 , 160 , 17 , 18 , 19 , 220 , 21 , 22 , 2123 } |            2  |          2 
 { 10 , 2 , 30 , 4 , 50 , 6 , 7 , 8 , 9 , 10 , 110 , 12 , 13 , 14 , 15 , 160 , 17 , 18 , 19 , 220 , 21 , 22 , 2123 } |            3  |         30 
 { 10 , 2 , 30 , 4 , 50 , 6 , 7 , 8 , 9 , 10 , 110 , 12 , 13 , 14 , 15 , 160 , 17 , 18 , 19 , 220 , 21 , 22 , 2123 } |            4  |          4 
 { 10 , 2 , 30 , 4 , 50 , 6 , 7 , 8 , 9 , 10 , 110 , 12 , 13 , 14 , 15 , 160 , 17 , 18 , 19 , 220 , 21 , 22 , 2123 } |            5  |         50 
 { 10 , 2 , 30 , 4 , 50 , 6 , 7 , 8 , 9 , 10 , 110 , 12 , 13 , 14 , 15 , 160 , 17 , 18 , 19 , 220 , 21 , 22 , 2123 } |            6  |          6 
 { 10 , 2 , 30 , 4 , 50 , 6 , 7 , 8 , 9 , 10 , 110 , 12 , 13 , 14 , 15 , 160 , 17 , 18 , 19 , 220 , 21 , 22 , 2123 } |            7  |          7 
 { 10 , 2 , 30 , 4 , 50 , 6 , 7 , 8 , 9 , 10 , 110 , 12 , 13 , 14 , 15 , 160 , 17 , 18 , 19 , 220 , 21 , 22 , 2123 } |            8  |          8 
 { 10 , 2 , 30 , 4 , 50 , 6 , 7 , 8 , 9 , 10 , 110 , 12 , 13 , 14 , 15 , 160 , 17 , 18 , 19 , 220 , 21 , 22 , 2123 } |            9  |          9 
 { 10 , 2 , 30 , 4 , 50 , 6 , 7 , 8 , 9 , 10 , 110 , 12 , 13 , 14 , 15 , 160 , 17 , 18 , 19 , 220 , 21 , 22 , 2123 } |           10  |         10 
 { 10 , 2 , 30 , 4 , 50 , 6 , 7 , 8 , 9 , 10 , 110 , 12 , 13 , 14 , 15 , 160 , 17 , 18 , 19 , 220 , 21 , 22 , 2123 } |           11  |        110 
 { 10 , 2 , 30 , 4 , 50 , 6 , 7 , 8 , 9 , 10 , 110 , 12 , 13 , 14 , 15 , 160 , 17 , 18 , 19 , 220 , 21 , 22 , 2123 } |           12  |         12 
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как развернуть массив в столбец?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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