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

Код: plaintext
1.
2.
3.
SELECT field1 AS now(),
field2 AS now() - ('1 days'::reltime),
field2 AS now() - ('2 days'::reltime),
. . . .

но не получается. Есть ли какие-нибудь идеи?
Если что - извините за тупость.
...
Рейтинг: 0 / 0
Динамические алиасы (или что-то вроде того)
    #33681931
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Андрей_МНеобходимо, чтобы заголовки полей содержали текущую дату, вчерашнюю, позавчерашнюю и т. д. Хочется сделать что-то вроде:

Код: plaintext
1.
2.
3.
SELECT field1 AS now(),
field2 AS now() - ('1 days'::reltime),
field2 AS now() - ('2 days'::reltime),
. . . .

но не получается. Есть ли какие-нибудь идеи?
Если что - извините за тупость.
Код: plaintext
1.
2.
3.
SELECT now() as field1,
now() - ('1 days'::reltime) as field2 ,
now() - ('2 days'::reltime) as field3
...
Рейтинг: 0 / 0
Динамические алиасы (или что-то вроде того)
    #33681992
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey Daeron _Андрей_МНеобходимо, чтобы заголовки полей содержали текущую дату, вчерашнюю, позавчерашнюю и т. д. Хочется сделать что-то вроде:

Код: plaintext
1.
2.
3.
SELECT field1 AS now(),
field2 AS now() - ('1 days'::reltime),
field2 AS now() - ('2 days'::reltime),
. . . .

но не получается. Есть ли какие-нибудь идеи?
Если что - извините за тупость.
Код: plaintext
1.
2.
3.
SELECT now() as field1,
now() - ('1 days'::reltime) as field2 ,
now() - ('2 days'::reltime) as field3

та не, он хоччет чо-то типа
Код: plaintext
1.
2.
3.
 EXECUTE 'SELECT field1 AS ' ||now() ||',
field2 AS '||now() - ('1 days'::reltime) ||',
field2 AS ' ||now() - ('2 days'::reltime)||',
. . . .
...
Рейтинг: 0 / 0
Динамические алиасы (или что-то вроде того)
    #33682835
_Андрей_М
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
та не, он хоччет чо-то типа
Код: plaintext
1.
2.
3.
 EXECUTE 'SELECT field1 AS ' ||now() ||',
field2 AS '||now() - ('1 days'::reltime) ||',
field2 AS ' ||now() - ('2 days'::reltime)||',
. . . .

Если можно, поподробнее насчёт EXECUTE.
Я так понимаю, ему нужен PREPARE?

Давайте на простом примере:

Код: plaintext
SELECT 'a' AS "хочу_здесь_дату"

даёт таблицу:

хочу_здесь_дату
-----------------
a
(1 запись)

как получить таблицу типа:

2006-04-21
------------
a
(1 запись)
...
Рейтинг: 0 / 0
Динамические алиасы (или что-то вроде того)
    #33682931
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Андрей_МЕсли можно, поподробнее насчёт EXECUTE.
Я так понимаю, ему нужен PREPARE?вообще говоря есть разные ексзекьюты. Я говорю об инструкции plpgsql, которая может быть вызвана именно в функции, написанной на plpgsql . (в этом случае просто ситуация аналогична составлению строки SQL и ее запуску приложением, с той разницей, что в роли приложения выступает сам сервер и его хранимка). О каком экзекьюте говорите вы - я не вполне догадываюсь.
...
Рейтинг: 0 / 0
Динамические алиасы (или что-то вроде того)
    #33685370
_Андрей_М
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще говоря есть разные ексзекьюты. Я говорю об инструкции plpgsql, которая может быть вызвана именно в функции, написанной на plpgsql . (в этом случае просто ситуация аналогична составлению строки SQL и ее запуску приложением, с той разницей, что в роли приложения выступает сам сервер и его хранимка). О каком экзекьюте говорите вы - я не вполне догадываюсь.
Я подумал о команде EXECUTE. Не совсем понял, как мне поможет запуск 'SELECT . . .' в функции. Ведь функция просто вернёт одно значение, а мне, получается, нужно вернуть целую таблицу (с заголовками).
...
Рейтинг: 0 / 0
Динамические алиасы (или что-то вроде того)
    #33685513
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Андрей_МЯ подумал о команде EXECUTE.если вы имеете в виду подпункт
Chapter 30. ECPG - Embedded SQL in C.
то это подслучай вызова скл из клиента. ПРосто формируете нужную строку на клиенте и выполняете как обычный скл. Это не тот ексзекьют, который непосредственно дергает строку из плпгскл.

_Андрей_МНе совсем понял, как мне поможет запуск 'SELECT . . .' в функции. Ведь функция просто вернёт одно значение, а мне, получается, нужно вернуть целую таблицу (с заголовками). есть ошибка в ваших умозаключениях. просмотрите документацию, или сделайте поиск по данному форуму по слову SETOF. ф-ии в постгресе неплохо возвращают таблицы, в т.ч. и с именованными столбцами. Правда при динамических возвращаемых структурах будет некий гемор с описанием типа возврата (его тоже, скорее всего, можно будет пошить только динамически - т.е. использовать либо из динамически формируемого запроса клиента, либо из другой функции)
...
Рейтинг: 0 / 0
Динамические алиасы (или что-то вроде того)
    #33697824
_Андрей_М
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению, так и не удалось сообразить, как заставить EXECUTE вернуть таблицу с заголовками. Сделал:

SELECT . . . INTO TEMPORARY TABLE t . . . ;
EXECUTE 'ALTER TABLE t RENAME date TO . . .';
SELECT * FROM t;

Спасибо всем, кто помогал.
...
Рейтинг: 0 / 0
Динамические алиасы (или что-то вроде того)
    #33697939
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может быть вы имеете в виду что-то типа этого? http://sql.ru/forum/actualthread.aspx?tid=190031
...
Рейтинг: 0 / 0
Динамические алиасы (или что-то вроде того)
    #33705886
_Андрей_М
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatможет быть вы имеете в виду что-то типа этого? http://sql.ru/forum/actualthread.aspx?tid=190031
Нет, это не совсем то.
Как я понял, в этом случае заголовки столбцов известны заранее. Мне же нужны динамически создаваемые заголовки.
...
Рейтинг: 0 / 0
Динамические алиасы (или что-то вроде того)
    #33706765
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не проще на клиенте разрулить?
...
Рейтинг: 0 / 0
Динамические алиасы (или что-то вроде того)
    #33709063
_Андрей_М
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Funny_FalconА не проще на клиенте разрулить?
Клиент - браузер и веб-запрос в таблицу Excel.
И опять же "Мы не ищем лёгких путей - у нас на это мозгов не хватает" (c) какой-то форум
...
Рейтинг: 0 / 0
Динамические алиасы (или что-то вроде того)
    #33711642
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так ведь браузеру кто-то генерит html (или xml, или Excel - не пойму я вас) - вот в ём то имена и выставляй сколько душе угодно. Наверное я не прав, но не пойму где, объясните.
...
Рейтинг: 0 / 0
Динамические алиасы (или что-то вроде того)
    #33713470
_Андрей_М
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Funny_FalconТак ведь браузеру кто-то генерит html (или xml, или Excel - не пойму я вас) - вот в ём то имена и выставляй сколько душе угодно. Наверное я не прав, но не пойму где, объясните.
Генерит html клиент 'psql -H'. Лепить таблицу из разных кусков как-то не хотелось. С другой стороны есть и чисто академический интерес.
Вот ещё похожий вопрос, хотя и не для этой темы:
Есть таблица, первый столбец которой содержит список каких-либо наименований. Последней строкой таблицы должна быть строка "Итого". Как её сфоримровать примерно понятно. Вопрос: как сделать строку "Итого" именно последней строкой?
...
Рейтинг: 0 / 0
Динамические алиасы (или что-то вроде того)
    #33713521
Алексей Ключников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. по сути надо написать функцию, которая будет выводить табличку со сгенерироваными названиями полей?
Тогда наверное как то так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE FUNCTION get_data(integer) RETURNS SETOF client_row 
    AS $$
declare
    r client_row;
begin   
    for r in EXECUTE 'SELECT c.id, c.name, c.size_x, c.size_y, c.color, c.coord_x, c.coord_y, (select output(c.id) AS data)  FROM client c WHERE c.vklad_id= ' || $ 1  || ' ORDER BY c.id DESC' loop
        return next r;
    end loop;
    return;
end
$$  
    LANGUAGE plpgsql;
Т.е. под EXECUTE формируется строка SELECT в которой и подставляются сгенерированые имена полей
...
Рейтинг: 0 / 0
Динамические алиасы (или что-то вроде того)
    #33714249
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
create table t1 ( id integer, para text, valu integer );

insert into t1 values (  1 , 'a',  100  );
insert into t1 values (  1 , 'b',  100  );
insert into t1 values (  1 , 'a',  100  );
insert into t1 values (  1 , 'b',  200  );
insert into t1 values (  1 , 'a',  100  );
insert into t1 values (  1 , 'c',  200  );
insert into t1 values (  2 , 'a',  100  );
insert into t1 values (  2 , 'a',  100  );
insert into t1 values (  2 , 'b',  200  );
insert into t1 values (  2 , 'a',  100  );
insert into t1 values (  3 , 'b',  100  );
insert into t1 values (  3 , 'b',  200  );
insert into t1 values (  3 , 'c',  200  );

select id, para, sum(valu) from t1 group by id, para;

--

create function td(char,char) returns char as '
  select $1 || \'    <td>\' || $2 || \'</td>\\n\'
' language SQL;
create aggregate td( sfunc = td, basetype = char, stype = char, initcond = '' );

create function tb(char,char) returns char as '
  select $1 || \'  <tr>\\n\' || $2 || \'  </tr>\\n\'
' language SQL;
create aggregate tb( sfunc = tb, basetype = char, stype = char, initcond = '' );

select '<table>\n'||tb(td('',coalesce(id::text,' '))||valu)||'</table>\n' as html from (
  select  20  as ordr, id, td(valu::text) as valu from (
    select id, para, coalesce(sum(valu), 0 ) as valu from t1
    natural right join (
      select id, para from ( select distinct para from t1 ) as c
      cross join ( select distinct id from t1 ) as d
    ) as b group by id, para order by id, para
  ) as a group by id
  union select  10  as ordr, null as id, td(para::text) as valu from (
    select distinct para from t1 order by para
  ) as e order by ordr, id
) as f;

--

drop aggregate tb(char);
drop function tb(char,char);
drop aggregate td(char);
drop function td(char,char);
drop table t1;
имхо, извращение, однако. я бы использовал другие средства для рисования html, а не psql, sql, plpgsql. p.s.: после полугода кропотливых стараний над постепенным усложнением plpgsql-функции, которая изначально выглядела как нельзя к месту; поняли что возможностей plpgsql не хватает, и унесли логику в приложение (perl). так и вашу задачу вроде бы можно с большим трудом :( решить средствами sql, но другими средствами это сделать гораздо легче. а когда-нибудь вы столкнетесь с задачей, которую сделать не удастся. :(

_Андрей_МВот ещё похожий вопрос, хотя и не для этой темы:
Есть таблица, первый столбец которой содержит список каких-либо наименований. Последней строкой таблицы должна быть строка "Итого". Как её сфоримровать примерно понятно. Вопрос: как сделать строку "Итого" именно последней строкой?см. выше: с помощью union, дополнительного фиктивного поля ordr, и последующей сортировки по этому полю
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Динамические алиасы (или что-то вроде того)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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