Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как транспонировать запись / 6 сообщений из 6, страница 1 из 1
06.04.2005, 10:13
    #32999558
novill
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как транспонировать запись
Задача:
Есть запись состоящая из интовых значений. Надо все их проверить на равенство(неравенство) нулю.
Какое поле должно быть равно нулю, а какое нет записано в колонке в другой таблице.

Надо узнать какое именно не выполнилось. Перебирать вручную очень не хочется. Если запись транспонировать (представить в столбик) то решение получается в одно действие.

Кто-нибудь знает как это проще всего сделать? или может в контрибах кто видел?
...
Рейтинг: 0 / 0
06.04.2005, 12:32
    #33000145
Fabrichenko Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как транспонировать запись
novill
Есть запись состоящая из интовых значений.


состоящая как именно?

в одной ячейке через запятую?
массив?
или N колонок и в каждой по цифре?

------------------------------------------
жизнь как пестня
...
Рейтинг: 0 / 0
06.04.2005, 12:42
    #33000189
фффф
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как транспонировать запись
если имеется в виду, что значения идут в отдельных столбцах, то примерно так:
Код: 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.
create table ccc (
  id serial primary key,
  a1 int,
  a2 int,
  a3 int
);
insert into ccc values(default,  0 ,  0 ,  0 );
insert into ccc values(default,  0 ,  1 ,  0 );
insert into ccc values(default,  1 ,  0 ,  1 );
insert into ccc values(default,  1 ,  1 ,  1 );

create type ccc_values as (id int, i int, a int);

CREATE OR REPLACE FUNCTION get_ccc_values() RETURNS setof ccc_values AS $_$
DECLARE
  rec RECORD;
  retv ccc_values;
BEGIN
  for rec in (SELECT * from ccc) loop
    retv := (rec.id,  1 , rec.a1); return next retv;
    retv := (rec.id,  2 , rec.a2); return next retv;
    retv := (rec.id,  3 , rec.a3); return next retv;
    --...--
  end loop;
  return;
END;
$_$ LANGUAGE plpgsql VOLATILE;

select * from get_ccc_values();
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
id	i	a
----------------
1	1	0
1	2	0
1	3	0
2	1	0
2	2	1
2	3	0
3	1	1
3	2	0
3	3	1
4	1	1
4	2	1
4	3	1
...
Рейтинг: 0 / 0
06.04.2005, 14:25
    #33000563
novill
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как транспонировать запись
Спасибо.
Примерно это и нужно было.

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

Можно ли "на лету" получать список полей по маске имени поля?
...
Рейтинг: 0 / 0
07.04.2005, 06:47
    #33001723
фффф
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как транспонировать запись
novill
Но есть еще проблема - количество таких полей может меняться, и не все поля таблицы надо сравнивать.

Можно ли "на лету" получать список полей по маске имени поля?
Заработался вчера совсем :-) Более простое решение есть:
Код: plaintext
1.
2.
3.
4.
create view ccc_values_view as
select id,  1  as i, a1 as a from ccc
union all select id,  2 , a2 from ccc
union all select id,  3 , a3 from ccc;
при выборке всех строк очень большой таблицы будет некоторый проигрыш по сравнению с функцией (многократный seq scan против одного), но при ограничении выборки скорее всего быстрее. И с разными вариантами функций для фильтрации заморачиваться не надо
Код: plaintext
1.
2.
select * from ccc_values_view where id= 12345 ;
select * from ccc_values_view where i in ( 1 , 3 );
А вообще, если планируются частые и разнообразные выборки - лучше нормализовать структуру. Правда база может распухнуть (оверхед на каждую строку приличный).
...
Рейтинг: 0 / 0
07.04.2005, 11:06
    #33002085
novill
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как транспонировать запись
фффф
А вообще, если планируются частые и разнообразные выборки - лучше нормализовать структуру. Правда база может распухнуть (оверхед на каждую строку приличный).
В том-то и дело что нормалиизация немеряно увеличит базу.
База заточена для других запросов.
Такой запрос единственный с своем роде.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как транспонировать запись / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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