Обсуждение: Re: [pgsql-ru-general] аггреггирование в массив с именами столбиков
Приветствую,
--
// Dmitriy.
5 марта 2011 г. 21:47 пользователь Dmitry E. Oboukhov <unera@debian.org> написал:
| col1 | col2 | сol3 | ... | colN |
| 123 | 124 | abc | ... | xyz |
вот данные в этой таблице - по сути хеш. вне базы данных не
используется иначе как хеш итп.
в таком "развернутом" виде данные хранятся относительно недолго,
далее они попадают в такую таблицу в поле h:
| что-то там | ... | h[][] |
где h - массив массивов text. Эта таблица - по сути архив. из нее
делаются редкие выборки, а поля по которым надо искать вынесены в
отдельные столбики. Все данные выбираются только на этапе построения
всяких отчетов где все эти данные нужны.
ну так вот. можно ли именно SQL-запросом переложить данные из первой
таблицы во вторую?
то есть получить массив вида
ARRAY[['col1', '123'], ['col2', '124'], ... ['colN', 'xyz']]
но при этом чтобы имена столбиков не писать в SQL-запросе? проблема в
том что таблица1 иногда альтертаблится (столбик добавляется),
соотвтственно хочется убрать зависимость от этих альтертаблов на
алгоритм архивирования
Речь идёт о полуструктурированных данных. Самое лучшее решение здесь -
использование замечательного модуля hstore, например:
dmitigr=> create table test (id serial not null, fname text, lname text);
NOTICE: CREATE TABLE will create implicit sequence "test_id_seq" for serial column "test.id"
CREATE TABLE
dmitigr=> insert into test(fname, lname) select 'dima', 'igrishin';
INSERT 0 1
dmitigr=> insert into test(fname, lname) select 'ivan', 'ivanov';
INSERT 0 1
dmitigr=> select hstore(test) from test;
hstore
-------------------------------------------------
"id"=>"1", "fname"=>"dima", "lname"=>"igrishin"
"id"=>"2", "fname"=>"ivan", "lname"=>"ivanov"
(2 rows)
Надеюсь, суть ясна.
Подробности здесь - http://www.postgresql.org/docs/9.0/static/hstore.html
PS. В данном случае возможно преобразовать столбец
h из типа text[][] в hstore.
использование замечательного модуля hstore, например:
dmitigr=> create table test (id serial not null, fname text, lname text);
NOTICE: CREATE TABLE will create implicit sequence "test_id_seq" for serial column "test.id"
CREATE TABLE
dmitigr=> insert into test(fname, lname) select 'dima', 'igrishin';
INSERT 0 1
dmitigr=> insert into test(fname, lname) select 'ivan', 'ivanov';
INSERT 0 1
dmitigr=> select hstore(test) from test;
hstore
-------------------------------------------------
"id"=>"1", "fname"=>"dima", "lname"=>"igrishin"
"id"=>"2", "fname"=>"ivan", "lname"=>"ivanov"
(2 rows)
Надеюсь, суть ясна.
Подробности здесь - http://www.postgresql.org/docs/9.0/static/hstore.html
PS. В данном случае возможно преобразовать столбец
h из типа text[][] в hstore.
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera@debian.org jabber://UNera@uvw.ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
--
// Dmitriy.
DI> Речь идёт о полуструктурированных данных. Самое лучшее решение здесь - DI> использование замечательного модуля hstore, например: DI> dmitigr=> create table test (id serial not null, fname text, lname text); DI> NOTICE: CREATE TABLE will create implicit sequence "test_id_seq" for serial DI> column "test.id: <http://test.id>" DI> CREATE TABLE DI> dmitigr=> insert into test(fname, lname) select 'dima', 'igrishin'; DI> INSERT 0 1 DI> dmitigr=> insert into test(fname, lname) select 'ivan', 'ivanov'; DI> INSERT 0 1 DI> dmitigr=> select hstore(test) from test; DI> hstore DI> ------------------------------------------------- "id"=>> "1", "fname"=>"dima", "lname"=>"igrishin" "id"=>> "2", "fname"=>"ivan", "lname"=>"ivanov" DI> (2 rows) очень интересно. но у меня сходу не работает: watcher_wwm=> select hstore(test) from test; ERROR: function hstore(test) does not exist СТРОКА 1:select hstore(test) from test; ^ ПОДСКАЗКА: No function matches the given name and argument types. You might need to add explicit type casts. оно с какой версии Pg доступно? DI> Надеюсь, суть ясна. DI> Подробности здесь - http://www.postgresql.org/docs/9.0/static/hstore.html ага, будем глядеть. тут еще интересный вопрос: есть ли поддержка прозрачного преобразования хешей в запросы и результатов в хеши на уровне драйвера DBD::Pg. С массивами-то оно есть, а вот например составные типы он так строками и оставляет. а если парсить каждую выборку, получается лучше на массивах и остаться DI> PS. В данном случае возможно преобразовать столбец DI> h из типа text[][] в hstore. -- . ''`. Dmitry E. Oboukhov : :’ : email: unera@debian.org jabber://UNera@uvw.ru `. `~’ GPGKey: 1024D / F8E26537 2006-11-21 `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
Вложения
5 марта 2011 г. 23:07 пользователь Dmitry E. Oboukhov <unera@debian.org> написал:
DI> Речь идёт о полуструктурированных данных. Самое лучшее решение здесь -
DI> использование замечательного модуля hstore, например:
DI> dmitigr=> create table test (id serial not null, fname text, lname text);
DI> NOTICE: CREATE TABLE will create implicit sequence "test_id_seq" for serial
DI> column "test.id: <http://test.id>"
DI> CREATE TABLE
DI> dmitigr=> insert into test(fname, lname) select 'dima', 'igrishin';
DI> INSERT 0 1
DI> dmitigr=> insert into test(fname, lname) select 'ivan', 'ivanov';
DI> INSERT 0 1
DI> dmitigr=> select hstore(test) from test;
DI> hstore
DI> -------------------------------------------------"id"=>> "1", "fname"=>"dima", "lname"=>"igrishin"DI> (2 rows)
"id"=>> "2", "fname"=>"ivan", "lname"=>"ivanov"
очень интересно. но у меня сходу не работает:
watcher_wwm=> select hstore(test) from test;
ERROR: function hstore(test) does not exist
СТРОКА 1:select hstore(test) from test;
^
ПОДСКАЗКА: No function matches the given name and
argument types. You might need to add explicit type
casts.
оно с какой версии Pg доступно?
Это доп. модуль. Его сначала необходимо установить.
Подробности здесь - http://www.postgresql.org/docs/9.0/static/contrib.html
Подробности здесь - http://www.postgresql.org/docs/9.0/static/contrib.html
DI> Надеюсь, суть ясна.
DI> Подробности здесь - http://www.postgresql.org/docs/9.0/static/hstore.html
ага, будем глядеть. тут еще интересный вопрос: есть ли поддержка
прозрачного преобразования хешей в запросы и результатов в хеши на
уровне драйвера DBD::Pg. С массивами-то оно есть, а вот например
составные типы он так строками и оставляет. а если парсить каждую
выборку, получается лучше на массивах и остаться
Это, я так понимаю, вопрос про библиотеку Perl ? К сожалению,
здесь я Вам не помогу.
здесь я Вам не помогу.
DI> PS. В данном случае возможно преобразовать столбец
DI> h из типа text[][] в hstore.--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera@debian.org jabber://UNera@uvw.ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
--
// Dmitriy.
DI> Это доп. модуль. Его сначала необходимо установить. DI> Подробности здесь - http://www.postgresql.org/docs/9.0/static/contrib.html да, я уже нашел, но все равно спасибо :) DI> Это, я так понимаю, вопрос про библиотеку Perl ? К сожалению, DI> здесь я Вам не помогу. ага, Perl. ну это уже специфика непостгрисовая наверное... но в общем hstore - хорошо, но хотелось бы и исходный вопрос прояснить. раз сделали hstore, то можно и повторить их путь. как в запросе вычислить и имена столбиков? пока на ум приходит только написать PL/Perl функцию, поскольку она оперирует хешами, то сможет вернуть и имена столбиков. а проще ще есть решения? -- . ''`. Dmitry E. Oboukhov : :’ : email: unera@debian.org jabber://UNera@uvw.ru `. `~’ GPGKey: 1024D / F8E26537 2006-11-21 `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537