gpt4 book ai didi

postgresql - 创建一个方法,该方法从可用作 View 的不同表中返回一组记录

转载 作者:行者123 更新时间:2023-11-29 12:11:41 25 4
gpt4 key购买 nike

create function fruit(proses varchar)
returns table("FRUIT" varchar, "ID" integer, "FRUITCOLOR" varchar, "PRICE" varchar, "PAY" varchar, "CHANGE" varchar) as
--fruit,id,fruitcolor is from table1, but price, pay, change is from table2
$$
begin
if proses = 'view1' then
return query
select fruit, id from table1;
elseif proses = 'view2' then
return query
select fruit, id, fruitcolor, price, pay, change from table, table2;
end if;
return;
end;
$$
language plpgsql;

这次,我不知道如何从不同的表中获取它,老实说,我试过一些方法,但结果是这样的:

Number of returned columns (3) does not match expected column count (6).

还有这个:

ERROR: column reference «fruit» ambiguous (has two meanings),

最佳答案

PL/pgSQL 函数修复

列数及其数据类型 必须与 RETURNS TABLE 中定义的行类型相匹配(列名是不相关的只要它们是明确的):

CREATE OR REPLACE FUNCTION fruit(proses text)
RETURNS TABLE("FRUIT" varchar, "ID" integer, "FRUITCOLOR" varchar, "PRICE" varchar
, "PAY" varchar, "CHANGE" varchar) AS
$func$
BEGIN
IF proses = 'view1' then
RETURN query
SELECT fruit, id, NULL::varchar, NULL::varchar, NULL::varchar, NULL::varchar
FROM table1;

ELSIF proses = 'view2' THEN
RETURN query
SELECT fruit, id, fruitcolor, price, pay, change FROM table2;
-- NOT: from table, table2;
END IF;
END
$func$ LANGUAGE plpgsql;

关于键入常量:

关于函数中的命名冲突:

使用纯 SQL 更简单:

只要您的代码像显示的那样简单,您就可以从根本上简化:

CREATE OR REPLACE FUNCTION fruit(proses text)
RETURNS TABLE("FRUIT" varchar, "ID" integer, "FRUITCOLOR" varchar, "PRICE" varchar
, "PAY" varchar, "CHANGE" varchar) AS
$func$
SELECT fruit, id, fruitcolor, price, pay, change FROM table2;
WHERE proses = 'view1'

UNION ALL
SELECT fruit, id, NULL, NULL, NULL, NULL FROM table1
WHERE proses = 'view2'
$func$ LANGUAGE sql;

只有一个(或没有)SELECT 会触及表格。对于其他,WHERE 条件始终为 false(或 null),因此不会从中返回任何行。

请注意这次我不必向添加的 NULL 值添加类型转换。这是因为 UNION 查询从第一个 SELECT 派生列名和类型。其余部分被强制为相同的行类型 - 如果不可能,则会发生错误。

这不会更快,只会更简单。

关于postgresql - 创建一个方法,该方法从可用作 View 的不同表中返回一组记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31241231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com