powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / [оптимизация] вывести значения из N разных колонок одной таблицы в одну колонку?
14 сообщений из 14, страница 1 из 1
[оптимизация] вывести значения из N разных колонок одной таблицы в одну колонку?
    #38952409
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
привет ребята
пожалуйста помогите, как оптимально можно вывести все значения из разных колонок в одну колонку?

придумал пример что бы было проще объяснить:
есть таблица А, где куча колонок, и есть колонки контрагент1, контрагент2, контрагент3, контрагент4

надо вывести список контрагентов участвующих в этой таблице удовлетворяя определенному условию (условие1)

на ум приходит только 1 способ через union:
Код: sql
1.
2.
3.
4.
5.
select контрагент1 from A where условие1
union select контрагент2 from A where условие1
union select контрагент3 from A where условие1
...
union select контрагентN from A where условие1

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

сделать это с помощью case when не получится потому что 1 запись в таблице А может содержать разных контрагентов (от 0 до N)

наверняка есть оптимальное решение о котором я не знаю, что можно с одним обращением к таблице А вывести полный список всех участвующих контрагентов ?

ваши варианты и пруфы
...
Рейтинг: 0 / 0
[оптимизация] вывести значения из N разных колонок одной таблицы в одну колонку?
    #38952433
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushka,

терминологически это unpivot и реализуется кросс-джоином на количество полей.
а вообще, храните деньги в нормализованном банке.
...
Рейтинг: 0 / 0
[оптимизация] вывести значения из N разных колонок одной таблицы в одну колонку?
    #38952446
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushkaпривет ребята
тамбоффскей фольк тябе рябёнок, дятил

Код: sql
1.
select unnest(ARRAY[контрагент1,контрагент2,контрагент3,контрагент4,контрагент5]) from A where условие1

[/quot] потом NULL-ы отфильтруй.
...
Рейтинг: 0 / 0
[оптимизация] вывести значения из N разных колонок одной таблицы в одну колонку?
    #38952453
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно воспользоваться тем, что unnest разворачивает двумерные массивы.
Извернуться как-то так:
Код: plsql
1.
2.
select unnest(('{' || string_agg( ARRAY[контрагент1,контрагент2,контрагент3]::text, ',') || '}')::text[])
from table
...
Рейтинг: 0 / 0
[оптимизация] вывести значения из N разных колонок одной таблицы в одну колонку?
    #38952479
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadmin,

модератор тут тоже думать не пробовал.

я вам намекну:

Код: sql
1.
2.
3.
4.
5.
6.
7.
WITH A (id, контрагент1,контрагент2,контрагент3,контрагент4,контрагент5)
AS (values 
(0,'контрагент1','контрагент2','контрагент3','контрагент4','контрагент5')
,(1,'контрагент11',NULL,'контрагент31',NULL,'контрагент51')
,(2,'контрагент12','контрагент22','контрагент32','контрагент42','контрагент52')
)
select unnest(ARRAY[контрагент1,контрагент2,контрагент3,контрагент4,контрагент5]) from A where id IN (0,1)



-- т.е. ваши трюки с получением двумерного массива через текст (кррасивые, если учесть что array_agg кажется на агрегированиии массивов должен обломиться) -- тут непришей кобыле хвост (как и потуги скромного модератера изобразить наличие мысли)

ну и 2 ТС -- если у вас от 9.3 -- то фильтрацию NULL можете делать на лету:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
WITH A (id, контрагент1,контрагент2,контрагент3,контрагент4,контрагент5)
AS (values 
(0,'контрагент1','контрагент2','контрагент3','контрагент4','контрагент5')
,(1,'контрагент11',NULL,'контрагент31',NULL,'контрагент51')
,(2,'контрагент12','контрагент22','контрагент32','контрагент42','контрагент52')
)
select v from A 
,LATERAL (SELECT * FROM unnest(ARRAY[A.контрагент1,A.контрагент2,A.контрагент3,A.контрагент4,A.контрагент5]) u(v)
			WHERE v IS NOT NULL ) foo
where id IN (0,1)
...
Рейтинг: 0 / 0
[оптимизация] вывести значения из N разных колонок одной таблицы в одну колонку?
    #38952493
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,
да нет тут модератора
...
Рейтинг: 0 / 0
[оптимизация] вывести значения из N разных колонок одной таблицы в одну колонку?
    #38952528
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadminqwwq,
да нет тут модератора
а кто тогда мои эмоциональные воззвания к вам об "подумать" потёр ?

кто же, как не модер--хьюманитариус [презираемая разновидность антисапиенса], озабоченный этикетом, но не логикой
...
Рейтинг: 0 / 0
[оптимизация] вывести значения из N разных колонок одной таблицы в одну колонку?
    #38952562
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

Ну, значит есть модератор, просто на шепелявую речь не реагирует.
...
Рейтинг: 0 / 0
[оптимизация] вывести значения из N разных колонок одной таблицы в одну колонку?
    #38952600
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавилась ложка дегтя:
еще одно условие, которое не могу вписать в решение с unnest qwwqWITH A (id, контрагент1,контрагент2,контрагент3,контрагент4,контрагент5)
AS (values
(0,'контрагент1','контрагент2','контрагент3','контрагент4','контрагент5')
,(1,'контрагент11',NULL,'контрагент31',NULL,'контрагент51')
,(2,'контрагент12','контрагент22','контрагент32','контрагент42','контрагент52')
)
select unnest(ARRAY[контрагент1,контрагент2,контрагент3,контрагент4,контрагент5]) from A where id IN (0,1)

переводя на используемый пример:
если контрагент встретился в любой из записей именно во второй колонке то для этого конрагента надо обязательно смотреть его документ
для всех остальных случаев документ знать нельзя

по старому способу через union:

Код: sql
1.
2.
3.
4.
5.
6.
7.
select kk,max(dok_id) from (
select контрагент1 as kk, 0 as dok_id from A where условие1
union select контрагент2, док2_ид from A where условие1
union select контрагент3, 0 from A where условие1
...
union select контрагентN, 0 from A where условие1
)k



у каждого контрагента есть 1 единственный уникальный документ
...
Рейтинг: 0 / 0
[оптимизация] вывести значения из N разных колонок одной таблицы в одну колонку?
    #38952632
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushka,

По-моему, ваша проблема в том, что вы контрагентов держите в разных полях. Все остальное - последствия.
Заведите таблицы "сделка", "контрагенты" и "контрагенты_сделок". У вас не будет никаких проблем ни с null, ни с выборкой контрагентов.
...
Рейтинг: 0 / 0
[оптимизация] вывести значения из N разных колонок одной таблицы в одну колонку?
    #38952648
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushka,
версия ПЖ какая ?

для >9.3

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
WITH A (id, контрагент1,контрагент2,контрагент3,контрагент4,контрагент5)
AS (values 
(0,'контрагент1','контрагент2','контрагент3','контрагент4','контрагент5')
,(1,'контрагент11',NULL,'контрагент31',NULL,'контрагент51')
,(2,'контрагент12','контрагент22','контрагент32','контрагент42','контрагент52')
)
select v,w from A 
,LATERAL (
SELECT A.контрагент1 AS v,0 AS w	WHERE A.контрагент1  IS NOT NULL
UNION ALL 
SELECT A.контрагент2 AS v,(SELECT 1 /*FROM .....*/ ) AS w	WHERE A.контрагент2  IS NOT NULL
UNION ALL 
SELECT A.контрагент3 AS v,0 AS w	WHERE A.контрагент3  IS NOT NULL
UNION ALL 
SELECT A.контрагент4 AS v,0 AS w	WHERE A.контрагент4  IS NOT NULL
UNION ALL 
SELECT A.контрагент5 AS v,0 AS w	WHERE A.контрагент5  IS NOT NULL

			) foo
where id IN (0,1)



для меньше -- пошейте массив строк , строки -- из 2-х полей с разделителем распарсивайте после unnest.
...
Рейтинг: 0 / 0
[оптимизация] вывести значения из N разных колонок одной таблицы в одну колонку?
    #38952683
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
версия к сожалению 9.1.14
по поводу контрагентов, это пример был вымышленный, на нем просто было легко объяснять

с нормализацией в этой бд норм: там все на ИДшках и отдельных таблицах завязано
черезчур даже много этих таблиц, я предпочитаю больше 1С структуру где все справочники в одной таблице (различаются по видам)
все доки в другой (различаются по типам) все константы в третьей и тп

тут на оборот для каждого чиха была сделана своя таблица, записей в этих таблицах, 100500
отдельные отчеты строятся очень долго. вот и придумал для легкого понимания этих контрагентов которых у нас вообще нет
...
Рейтинг: 0 / 0
[оптимизация] вывести значения из N разных колонок одной таблицы в одну колонку?
    #38952692
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>вы контрагентов держите в разных полях.

обычный случай: какая нить экспертиза например

таблица А это может быть док подтверждающий акт проведения экспертизы

контрагент1 это заявитель на экспертизу
контрагент2 это хозяин объекта
контрагент3 это подрядная организация
контрагент4 это еще какая нить инспекция участвующая в дележке пирога
и тп
пример всего лишь плод воображения
...
Рейтинг: 0 / 0
[оптимизация] вывести значения из N разных колонок одной таблицы в одну колонку?
    #38952699
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushkaверсия к сожалению 9.1.14

пофантазируйте в эту сторону:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
WITH A (id, контрагент1,контрагент2,контрагент3,контрагент4,контрагент5)
AS (values 
(0,'контрагент1','контрагент2','контрагент3','контрагент4','контрагент5')
,(1,'контрагент11',NULL,'контрагент31',NULL,'контрагент51')
,(2,'контрагент12','контрагент22','контрагент32','контрагент42','контрагент52')
)
SELECT v[1]::text u, v[2]::integer w FROM
	(select string_to_array(unnest(ARRAY[
		(контрагент1||'^'||'0')
		,(контрагент2||'^'||'1')
		,(контрагент3||'^'||'0')
		,(контрагент4||'^'||'0')
		,(контрагент5||'^'||'0')
		]
		),'^') v
	from A where id IN (0,1)
	) foo WHERE  v[1] IS NOT NULL



хотя в большинстве случаев от исходного union all наверное можно не отказываться -- там физическихх чтений будет столько же, а вот как дальше -- надо проверять на объёмах.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / [оптимизация] вывести значения из N разных колонок одной таблицы в одну колонку?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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