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;
这一次,我不知道如何从不同的表中得到它, 老实说,我已经尝试了一下,但这就是发生的事情:
返回的列数(3)与预期的列数(6)不匹配。
和此:
错误:列引用«fruit»含糊不清(有两个含义),
答案 0 :(得分:1)
您的两个选择应返回相同类型的列。在你的情况下" varchar,integer,varchar,varchar,varchar,varchar"。因此,您可以在第一个查询中添加空值而不是缺少的列。您还需要在编写函数时在选择中指定每个变量的表名,如
中所示SELECT table1.fruit, table1.id, NULL::varchar, NULL::varchar, NULL::varchar, NULL::varchar FROM table1
答案 1 :(得分:1)
列数及其数据类型必须与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;
中定义的行类型匹配(列名与无关,只要它们是明确的):
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
会触及该表格。对于其他(s),UNION
条件始终为false(或null),因此不会从这些条件返回任何行。
注意我这次不必为添加的NULL值添加类型转换。这是因为SELECT
查询从第一个readFile
派生列名称和类型。其余部分被强制转换为相同的行类型 - 如果不可能则会发生错误。
这不会更快,更简单。