创建一个方法,该方法 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;
关于键入常量:
关于函数中的命名冲突:
Postgres Function NULL value for row that references NEW
Naming conflict between function parameter and result of JOIN with USING clause
简单的简单 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
派生列名和类型。其余部分被强制为相同的行类型 - 如果不可能,则会发生错误。
这不会更快,只会更简单。
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;
关于键入常量:
关于函数中的命名冲突:
Postgres Function NULL value for row that references NEW
Naming conflict between function parameter and result of JOIN with USING clause
简单的简单 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
派生列名和类型。其余部分被强制为相同的行类型 - 如果不可能,则会发生错误。
这不会更快,只会更简单。