Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
View с условием или функция, возвращающая таблицу???
|
|||
|---|---|---|---|
|
#18+
Приветствую всех. Столкнулся с проблемой, решение которой не могу найти. У меня есть огромный запрос, который делает выборки из нескольких таблиц, и, в соответствии с некоторыми параметрами, делает какие-то замены в возвращаемой таблице. Далее результат данного запроса у меня используется в других запросах. Понятно, что такой запрос каждый раз править и пихать в другие запросы очень трудоемкая задача. Я хотел перенести его в представление, но не нашел, как передавать в представление необходимые параметры. Тогда я попробовал написать функцию, которая бы возвращала таблицу. Но и это оказалось сделать нельзя. Максимум, что получилось - это столбец, который содержал значения всех колонок моего запроса, разделенных запятыми. Кто-нибудь знает как решить подобную проблему? С уважением Vector. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 09:12 |
|
||
|
View с условием или функция, возвращающая таблицу???
|
|||
|---|---|---|---|
|
#18+
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(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 09:42 |
|
||
|
View с условием или функция, возвращающая таблицу???
|
|||
|---|---|---|---|
|
#18+
авторв возвращаемом наборе? или апдейт в таблице? В возвращаемом наборе. Физические данные в самой таблице не меняются. автордобавлять в 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(); В этом случае Возвращается одна колонка, в которой значения всех полей перечислены через запятую. А мне надо таблицу, чтобы я мог использовать эти значения в других запросах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 09:54 |
|
||
|
View с условием или функция, возвращающая таблицу???
|
|||
|---|---|---|---|
|
#18+
Vectorзначение параметра задается пользователем во время работы программы. Как такое передать во view? отбирать из view по условию не получится, потому как условие нужно на момент формирования возвращаемого набора. Например: SELECT CASE WHEN table."field1"=$Param1 THEN table."field1" ELSE '' END AS "field1" ... и т.д.пишите этот case не при формировании view, а при выборке из него: Код: plaintext 1. 2. 3. 4. 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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 10:09 |
|
||
|
View с условием или функция, возвращающая таблицу???
|
|||
|---|---|---|---|
|
#18+
PS: попробуйте запинать через view, а не через функции. через view скорее всего будет легче постгресовому оптимизатору. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 10:11 |
|
||
|
View с условием или функция, возвращающая таблицу???
|
|||
|---|---|---|---|
|
#18+
авторпишите этот 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 значению??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 10:20 |
|
||
|
View с условием или функция, возвращающая таблицу???
|
|||
|---|---|---|---|
|
#18+
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... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 10:36 |
|
||
|
View с условием или функция, возвращающая таблицу???
|
|||
|---|---|---|---|
|
#18+
Всем спасибо. Понял свою ошибку. Дело в том, ч то я получал значение функции вот так: SELECT f() В этом случае все колонки объединялись в одну и значения шли через запятую. Если же выполнять запроса вот так: SELECT * FROM f() В этом случае получаем вид таблицы, т.е. все колонки получаются отдельно друг от друга. Большое спасибо!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 10:49 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=34833450&tid=2004998]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 354ms |

| 0 / 0 |
