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

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

но не получается. Есть ли какие-нибудь идеи?
Если что - извините за тупость.
...
Рейтинг: 0 / 0
21.04.2006, 11:55
    #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
21.04.2006, 12:03
    #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
21.04.2006, 14:40
    #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
21.04.2006, 15:04
    #33682931
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические алиасы (или что-то вроде того)
_Андрей_МЕсли можно, поподробнее насчёт EXECUTE.
Я так понимаю, ему нужен PREPARE?вообще говоря есть разные ексзекьюты. Я говорю об инструкции plpgsql, которая может быть вызвана именно в функции, написанной на plpgsql . (в этом случае просто ситуация аналогична составлению строки SQL и ее запуску приложением, с той разницей, что в роли приложения выступает сам сервер и его хранимка). О каком экзекьюте говорите вы - я не вполне догадываюсь.
...
Рейтинг: 0 / 0
24.04.2006, 09:49
    #33685370
_Андрей_М
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические алиасы (или что-то вроде того)
вообще говоря есть разные ексзекьюты. Я говорю об инструкции plpgsql, которая может быть вызвана именно в функции, написанной на plpgsql . (в этом случае просто ситуация аналогична составлению строки SQL и ее запуску приложением, с той разницей, что в роли приложения выступает сам сервер и его хранимка). О каком экзекьюте говорите вы - я не вполне догадываюсь.
Я подумал о команде EXECUTE. Не совсем понял, как мне поможет запуск 'SELECT . . .' в функции. Ведь функция просто вернёт одно значение, а мне, получается, нужно вернуть целую таблицу (с заголовками).
...
Рейтинг: 0 / 0
24.04.2006, 10:40
    #33685513
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические алиасы (или что-то вроде того)
_Андрей_МЯ подумал о команде EXECUTE.если вы имеете в виду подпункт
Chapter 30. ECPG - Embedded SQL in C.
то это подслучай вызова скл из клиента. ПРосто формируете нужную строку на клиенте и выполняете как обычный скл. Это не тот ексзекьют, который непосредственно дергает строку из плпгскл.

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

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

Спасибо всем, кто помогал.
...
Рейтинг: 0 / 0
28.04.2006, 15:58
    #33697939
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические алиасы (или что-то вроде того)
может быть вы имеете в виду что-то типа этого? http://sql.ru/forum/actualthread.aspx?tid=190031
...
Рейтинг: 0 / 0
04.05.2006, 10:10
    #33705886
_Андрей_М
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические алиасы (или что-то вроде того)
LeXa NalBatможет быть вы имеете в виду что-то типа этого? http://sql.ru/forum/actualthread.aspx?tid=190031
Нет, это не совсем то.
Как я понял, в этом случае заголовки столбцов известны заранее. Мне же нужны динамически создаваемые заголовки.
...
Рейтинг: 0 / 0
04.05.2006, 13:14
    #33706765
Funny_Falcon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические алиасы (или что-то вроде того)
А не проще на клиенте разрулить?
...
Рейтинг: 0 / 0
05.05.2006, 10:16
    #33709063
_Андрей_М
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические алиасы (или что-то вроде того)
Funny_FalconА не проще на клиенте разрулить?
Клиент - браузер и веб-запрос в таблицу Excel.
И опять же "Мы не ищем лёгких путей - у нас на это мозгов не хватает" (c) какой-то форум
...
Рейтинг: 0 / 0
05.05.2006, 21:46
    #33711642
Funny_Falcon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические алиасы (или что-то вроде того)
Так ведь браузеру кто-то генерит html (или xml, или Excel - не пойму я вас) - вот в ём то имена и выставляй сколько душе угодно. Наверное я не прав, но не пойму где, объясните.
...
Рейтинг: 0 / 0
06.05.2006, 15:52
    #33713470
_Андрей_М
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические алиасы (или что-то вроде того)
Funny_FalconТак ведь браузеру кто-то генерит html (или xml, или Excel - не пойму я вас) - вот в ём то имена и выставляй сколько душе угодно. Наверное я не прав, но не пойму где, объясните.
Генерит html клиент 'psql -H'. Лепить таблицу из разных кусков как-то не хотелось. С другой стороны есть и чисто академический интерес.
Вот ещё похожий вопрос, хотя и не для этой темы:
Есть таблица, первый столбец которой содержит список каких-либо наименований. Последней строкой таблицы должна быть строка "Итого". Как её сфоримровать примерно понятно. Вопрос: как сделать строку "Итого" именно последней строкой?
...
Рейтинг: 0 / 0
06.05.2006, 16:11
    #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
07.05.2006, 00:51
    #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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Динамические алиасы (или что-то вроде того) / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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