创建一个方法,该方法返回一组记录FROM不同的表,可用作视图

时间:2015-07-06 08:38:50

标签: postgresql plpgsql

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»含糊不清(有两个含义),

2 个答案:

答案 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)

PL / pgSQL功能已修复

列数及其数据类型必须与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;

关于键入常量:

关于函数中的命名冲突:

使用普通SQL更简单:

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

SELECT

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

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

这不会更快,更简单。