创建一个方法,该方法 returns 一组来自不同 table 的记录,可用作视图

Create a method that returns a set of records FROM different table that can be used as a view

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;

这一次,我不知道如何从不同的 table 获取它, 老实说,我已经试过了,但结果是这样的:

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

还有这个:

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

您的两个选择应该return 相同类型的列。在你的情况下 "varchar, integer, varchar, varchar, varchar, varchar"。因此,您可以在第一个查询中添加空值而不是缺失的列。还需要在编写函数时指定table中每个变量的名称

SELECT table1.fruit, table1.id, NULL::varchar, NULL::varchar, NULL::varchar, NULL::varchar FROM table1

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会触及table。对于其他人,WHERE 条件始终为 false(或 null),因此不会从中返回任何行。

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

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