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

Столкнулся с проблемой, решение которой не могу найти.
У меня есть огромный запрос, который делает выборки из нескольких таблиц, и,
в соответствии с некоторыми параметрами, делает какие-то замены в возвращаемой
таблице.

Далее результат данного запроса у меня используется в других запросах.
Понятно, что такой запрос каждый раз править и пихать в другие запросы очень
трудоемкая задача.

Я хотел перенести его в представление, но не нашел, как передавать в представление
необходимые параметры.
Тогда я попробовал написать функцию, которая бы возвращала таблицу. Но и это оказалось
сделать нельзя. Максимум, что получилось - это столбец, который содержал значения всех
колонок моего запроса, разделенных запятыми.

Кто-нибудь знает как решить подобную проблему?
С уважением Vector.
...
Рейтинг: 0 / 0
View с условием или функция, возвращающая таблицу???
    #34833450
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VectorУ меня есть огромный запрос, который ... делает какие-то замены в возвращаемой
таблице.в возвращаемом наборе? или апдейт в таблице?

VectorДалее результат данного запроса у меня используется в других запросах.
Понятно, что такой запрос каждый раз править и пихать в другие запросы очень
трудоемкая задача.не только трудоемко, но и есть зло, так как copy-paste

VectorЯ хотел перенести его в представление, но не нашел, как передавать в представление
необходимые параметры.добавлять в where
create view v_1 ...;
select * from v_1 where name='lexa';

VectorТогда я попробовал написать функцию, которая бы возвращала таблицу. Но и это оказалось
сделать нельзя.create type p_1 as ( id integer, name text );
create function f_1() returns setof p_1 language 'SQL' as 'select 1, ''foo''::text union select 2, ''bar''::text';
select * from f_1();
...
Рейтинг: 0 / 0
View с условием или функция, возвращающая таблицу???
    #34833491
Фотография Vector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторв возвращаемом наборе? или апдейт в таблице?

В возвращаемом наборе. Физические данные в самой таблице не меняются.

автордобавлять в where
create view v_1 ...;
select * from v_1 where name='lexa';


Совет отличный, только вот значение параметра задается пользователем во время работы программы. Как такое передать во view?
отбирать из view по условию не получится, потому как условие нужно на момент формирования
возвращаемого набора.
Например:
SELECT
CASE WHEN table."field1"=$Param1
THEN table."field1"
ELSE ''
END AS "field1"
...
и т.д.

Мне нужно значение параметра на момент формирования.

авторcreate type p_1 as ( id integer, name text );
create function f_1() returns setof p_1 language 'SQL' as 'select 1, ''foo''::text union select 2, ''bar''::text';
select * from f_1();
В этом случае
Возвращается одна колонка, в которой значения всех полей перечислены через запятую.
А мне надо таблицу, чтобы я мог использовать эти значения в других запросах.
...
Рейтинг: 0 / 0
View с условием или функция, возвращающая таблицу???
    #34833531
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vectorзначение параметра задается пользователем во время работы программы. Как такое передать во view?
отбирать из view по условию не получится, потому как условие нужно на момент формирования
возвращаемого набора.
Например:
SELECT
CASE WHEN table."field1"=$Param1
THEN table."field1"
ELSE ''
END AS "field1"
...
и т.д.пишите этот case не при формировании view, а при выборке из него:
Код: plaintext
1.
2.
3.
4.
SELECT
    CASE WHEN view."field1"=$Param1
            THEN view."field1"
            ELSE ''
    END AS "field1"

Vector авторcreate type p_1 as ( id integer, name text );
create function f_1() returns setof p_1 language 'SQL' as 'select 1, ''foo''::text union select 2, ''bar''::text';
select * from f_1();В этом случае
Возвращается одна колонка, в которой значения всех полей перечислены через запятую.НЕТ. Возвращается тип p_1, который состоит из integer и text.

Vectorчтобы я мог использовать эти значения в других запросах.Можно.
select id from ( select * from f_1() ) as F1;
...
Рейтинг: 0 / 0
View с условием или функция, возвращающая таблицу???
    #34833543
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS: попробуйте запинать через view, а не через функции. через view скорее всего будет легче постгресовому оптимизатору.
...
Рейтинг: 0 / 0
View с условием или функция, возвращающая таблицу???
    #34833583
Фотография Vector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторпишите этот case не при формировании view, а при выборке из него:
SELECT
CASE WHEN view."field1"=$Param1
THEN view."field1"
ELSE ''
END AS "field1"

В этом случае смысл view пропадает. Это тоже самое что выбирать из таблицы!!! Нужны почти все поля, а этих CASE много. Вот почему я и хотел избавиться от такого громоздкого запроса
запихав эти case-ы в представление или функцию.

авторНЕТ. Возвращается тип p_1, который состоит из integer и text.


А мне надо колонку типа integer и колонку типа text.
В других таблицах у меня нету этого типа. Или, например, например надо упорядочить
по text значению??? Или JOIN сделать по integer значению???
...
Рейтинг: 0 / 0
View с условием или функция, возвращающая таблицу???
    #34833635
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VectorНужны почти все поля, а этих CASE много. Вот почему я и хотел избавиться от такого громоздкого запроса запихав эти case-ы в представление или функцию.ИМХО, перекладываете задачу клиента на плечи сервера

VectorА мне надо колонку типа integer и колонку типа text.Так и получается. Тип p_1 сотоит из поля id типа integer и поля name типа text.

Vectorнапример надо упорядочить по text значению???select * from f_1() order by name

VectorИли JOIN сделать по integer значению???select * from f_1() join t_1 on f_1.id=t_1...
...
Рейтинг: 0 / 0
View с условием или функция, возвращающая таблицу???
    #34833683
Фотография Vector
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо. Понял свою ошибку.

Дело в том, ч то я получал значение функции вот так:

SELECT f()

В этом случае все колонки объединялись в одну и значения шли через запятую.

Если же выполнять запроса вот так:

SELECT * FROM f()

В этом случае получаем вид таблицы, т.е. все колонки получаются отдельно друг от друга.

Большое спасибо!!!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / View с условием или функция, возвращающая таблицу???
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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