在 PlPGSQL 中以新数据类型返回两个不同的行
Returning two different rows in a new data type in PlPGSQL
我正在尝试编写一个函数,该函数 returns 来自两个不同行的数据,采用新的数据类型。
这是我目前拥有的:
CREATE TABLE foo(
dt DATE NOT NULL,
f1 REAL NOT NULL,
f2 REAL NOT NULL,
f3 REAL NOT NULL,
f4 REAL NOT NULL,
);
CREATE TYPE start_finish_type AS (start_f1 REAL, start_f2 REAL, start_f3 REAL, start_f4 REAL,
finish_f1 REAL, finish_f2 REAL, finish_f3 REAL, finish_f4 REAL);
CREATE FUNCTION fetch_begin_end_data(start_date DATE, finish_date DATE)
RETURNS start_finish_type AS $$
DECLARE
actual_start_date DATE;
actual_finish_date DATE ;
retval start_finish_type;
BEGIN
-- Select earliest row matching start_date
SELECT MIN(dt) INTO actual_start_date FROM foo WHERE dt >= start_date;
SELECT MIN(dt) INTO actual_finish_date FROM foo WHERE dt <= finish_date;
SELECT f1,f2, f3, f4 FROM foo WHERE dt = actual_start_date;
SELECT f1,f2, f3, f4 FROM foo WHERE dt = actual_finish_date;
-- How do I store the values obtained above and return them in the new type?
END
$$ LANGUAGE plpgsql;
我的问题是:如何修改函数,使其 returns 来自两个不同行的数据,并 returns 它们采用新的数据类型?
尝试:
CREATE or replace FUNCTION fetchbeginenddata(start_date DATE, end_date DATE)
RETURNS startfinishtype AS $$
DECLARE
actual_start_date DATE;
actual_finish_date DATE ;
retval startfinishtype;
BEGIN
-- Select earliest row matching start_date
SELECT MIN(dt) INTO actual_start_date FROM foo WHERE dt >= start_date;
SELECT MIN(dt) INTO actual_finish_date FROM foo WHERE dt <= finish_date;
SELECT (a.f1,a.f2, a.f3, a.f4,b.f1,b.f2, b.f3, b.f4)
FROM
(SELECT f1,f2, f3, f4 FROM foo WHERE dt = actual_start_date) a
JOIN
(SELECT f1,f2, f3, f4 FROM foo WHERE dt = actual_finish_date) b
ON true into retval;
return retval;
END
$$ LANGUAGE plpgsql;
当然需要这两个都选择 return 一行
更新
正如@eurotrash 所述,您可能希望显式命名复合类型属性以匹配顺序,例如:
INTO retval.start_f1, retval.start_f2, ...
不只是
INTO retval;
我正在尝试编写一个函数,该函数 returns 来自两个不同行的数据,采用新的数据类型。
这是我目前拥有的:
CREATE TABLE foo(
dt DATE NOT NULL,
f1 REAL NOT NULL,
f2 REAL NOT NULL,
f3 REAL NOT NULL,
f4 REAL NOT NULL,
);
CREATE TYPE start_finish_type AS (start_f1 REAL, start_f2 REAL, start_f3 REAL, start_f4 REAL,
finish_f1 REAL, finish_f2 REAL, finish_f3 REAL, finish_f4 REAL);
CREATE FUNCTION fetch_begin_end_data(start_date DATE, finish_date DATE)
RETURNS start_finish_type AS $$
DECLARE
actual_start_date DATE;
actual_finish_date DATE ;
retval start_finish_type;
BEGIN
-- Select earliest row matching start_date
SELECT MIN(dt) INTO actual_start_date FROM foo WHERE dt >= start_date;
SELECT MIN(dt) INTO actual_finish_date FROM foo WHERE dt <= finish_date;
SELECT f1,f2, f3, f4 FROM foo WHERE dt = actual_start_date;
SELECT f1,f2, f3, f4 FROM foo WHERE dt = actual_finish_date;
-- How do I store the values obtained above and return them in the new type?
END
$$ LANGUAGE plpgsql;
我的问题是:如何修改函数,使其 returns 来自两个不同行的数据,并 returns 它们采用新的数据类型?
尝试:
CREATE or replace FUNCTION fetchbeginenddata(start_date DATE, end_date DATE)
RETURNS startfinishtype AS $$
DECLARE
actual_start_date DATE;
actual_finish_date DATE ;
retval startfinishtype;
BEGIN
-- Select earliest row matching start_date
SELECT MIN(dt) INTO actual_start_date FROM foo WHERE dt >= start_date;
SELECT MIN(dt) INTO actual_finish_date FROM foo WHERE dt <= finish_date;
SELECT (a.f1,a.f2, a.f3, a.f4,b.f1,b.f2, b.f3, b.f4)
FROM
(SELECT f1,f2, f3, f4 FROM foo WHERE dt = actual_start_date) a
JOIN
(SELECT f1,f2, f3, f4 FROM foo WHERE dt = actual_finish_date) b
ON true into retval;
return retval;
END
$$ LANGUAGE plpgsql;
当然需要这两个都选择 return 一行
更新 正如@eurotrash 所述,您可能希望显式命名复合类型属性以匹配顺序,例如:
INTO retval.start_f1, retval.start_f2, ...
不只是
INTO retval;