Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как развернуть массив в столбец? / 5 сообщений из 5, страница 1 из 1
15.05.2008, 12:04
    #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
15.05.2008, 15:52
    #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
15.05.2008, 16:44
    #35315033
Ostrovok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как развернуть массив в столбец?
Спасибо.

я надыбал тоже самое решение :)), только отсюда http://www.opennet.ru/base/dev/psql_index_array.txt.html
...
Рейтинг: 0 / 0
15.05.2008, 17:30
    #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
16.05.2008, 12:22
    #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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как развернуть массив в столбец? / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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