我需要创建一个接受两个参数的宏或函数,并在基本数据操作之后将它们连接在一起。然后,此文本字符串应该能够在任何其他查询中使用。
CREATE OR REPLACE FUNCTION getData (_table text, _days text)
RETURNS text AS
$func$
SELECT $1 || to_char(CURRENT_TIMESTAMP - ($2 || ' days')::INTERVAL, 'YYYYMMDD');
$func$ LANGUAGE sql;
select * from getData('opportunity', '4') limit 10;
所以我期待的是实际得到与我执行
相同的结果select * from opportunity20151030 limit 10;
相反,我得到“opportunity20151030”
编辑:
我们需要这个的原因是因为我的雇主正在对我们的salesforce数据进行夜间快照,大约有17个对象。这就是为什么我不能退回一张桌子。返回表需要指定列。但我们需要能够查询各种表格。这真的只需要一个小的实用宏。这样我们就可以有一个查询,生成比较今天和一周前数据的图表。这甚至可以是pgAdmin本身内部的东西,并不仅限于postgresql函数。有没有办法可以执行该函数并在另一个查询中使用内联结果。我花了一个小时玩弄
使用getData('机会','4')
执行'select * from $ 1'类型查询,但显然指定的LANGUAGE会更改在兼容的SQL语句方面可以使用和不可以使用的内容。
谢谢!
答案 0 :(得分:0)
好吧,你的功能正好回复你要求的...你要查看的表的名称。
现在,虽然您可以执行一个返回表格数据的函数,但该函数必须知道"结构"那些数据。这意味着您不能将它用于任何表,但是那些具有相同结构的表(相同数量的字段,相同数据类型的相同顺序)。猜测你的表的名称,我会说这是一个继承的表,像下面的那个函数可以为机会的任何派生(继承)表做伎俩
CREATE OR REPLACE FUNCTION getData (_table text, _days text, _limit int default -1)
RETURNS SETOF opportunity AS
$func$
DECLARE
table_name text;
limit_clause text = ' ';
BEGIN
SELECT _table || to_char(CURRENT_TIMESTAMP - (_days || ' days')::INTERVAL, 'YYYYMMDD') INTO table_name;
IF _limit > -1 THEN
limit_clause = ' LIMIT ' || _limit;
END IF;
RETURN QUERY EXECUTE 'SELECT * FROM ' || table_name || limit_clause;
RETURN;
END
$func$ LANGUAGE plpgsql;
并使用它:
select * from getData('opportunity', '4', 10);
PS1:我把限制作为函数中的一个额外参数,但因为该参数有一个默认值,你可以在调用函数时忽略它,并返回所有值。我把它放在那里因为否则该函数将返回表中的所有行并在此之后限制。
PS2:除非你真的认为需要,否则我会避免这样做,因为如果把它放在一个更大的查询中,就无法优化。