它可能看起来像是现有问题的重复(例如This one),但它们只涉及传递" new"参数,而不是从数据库中选择行。
我有一张桌子,例如:
var pipeline = [
{
"$match": {
"type": {
"$in": ['mobile','voip']
},
"process_time": {
"$gte": start_date,
"$lte": end_date
}
}
},
{
"$group": {
"_id": null
"total_duration": { "$sum": "$duration" }
}
}
]
var linkNames = db.lines.aggregate(pipeline).toArray();
if (linkNames.length > 0) { printjson (linkNames[0].total_duration); }
一个功能:
CREATE TABLE my_table (
id bigserial NOT NULL,
name text,
CONSTRAINT my_table_pkey PRIMARY KEY (id)
);
我想在数据库中已存在的数据上运行它。如果我想从另一个PL / pgSQL存储过程中使用它,那没问题,例如:
CREATE FUNCTION do_something(row_in my_table) RETURNS void AS
$$
BEGIN
-- does something
END;
$$
LANGUAGE plpgsql;
但是,我不知道如何使用"普通"查询,例如
-- ...
SELECT * INTO row_var FROM my_table WHERE id = 123; -- row_var is of type my_table%rowtype
PERFORM do_something(row_var);
-- ...
有没有办法执行这样的查询?
答案 0 :(得分:3)
您需要将标量记录传递给该函数,这需要将实际选择括在另一对括号中:
SELECT do_something( (SELECT * FROM my_table WHERE id = 123) );
但是上面的 NOT 工作,因为该函数只需要单个列(类型为my_table
的记录),而select *
会返回多列(与具有多个字段的单个记录不同)。
要从select中返回记录,您需要使用以下语法:
SELECT do_something( (SELECT my_table FROM my_table WHERE id = 123) );
请注意,如果您不确保select
只返回一行,则可能仍会失败。
如果要将该函数应用于多行,可以这样做:
select do_something(my_table)
from my_table;