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

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

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


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

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

------------------------------------------
жизнь как пестня
...
Рейтинг: 0 / 0
Как транспонировать запись
    #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
Как транспонировать запись
    #33000563
novill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
Примерно это и нужно было.

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

Можно ли "на лету" получать список полей по маске имени поля?
...
Рейтинг: 0 / 0
Как транспонировать запись
    #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
Как транспонировать запись
    #33002085
novill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
фффф
А вообще, если планируются частые и разнообразные выборки - лучше нормализовать структуру. Правда база может распухнуть (оверхед на каждую строку приличный).
В том-то и дело что нормалиизация немеряно увеличит базу.
База заточена для других запросов.
Такой запрос единственный с своем роде.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как транспонировать запись
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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