使用PostgreSQL 9.6.3。我是数据库中的新功能。
我们说有多个项目编号表。每个都有项目编号,项目成本和其他几个列,这些列被计入"额外成本"。我想把计算放到一个函数中,所以我可以为任何这些表调用它。
所以而不是:
SELECT
itemnumber,
itemname,
base,
CASE
WHEN labor < 100 AND overhead < .20 THEN
WHEN .....
WHEN .....
WHEN .....
.....
END AS add_cost,
gpm
FROM items1;
我可以这样做:
SELECT
itemnumber,
itemname,
base,
calc_add_cost(),
gpm
FROM items1;
如果我希望能够在任何item
表上使用它,我想我需要设置一个table_name
参数,该函数将表名添加到函数中至少可以说是不可取的。
calc_add_cost(items1)
但是,有一种更简单的方法,当我调用calc_add_cost()
时,它只会使用FROM
子句中的表名吗?
SELECT ....., calc_add_cost(item1) FROM item1
看起来多余。
我确实遇到过一些主题,其中的标题听起来像是我们希望完成的内容,但在审核它们时,看起来它们是一个不同的问题。
答案 0 :(得分:2)
您甚至可以像想象的那样模拟“计算字段”或“生成列”。基础知识:
一个表的简单演示:
CREATE OR REPLACE FUNCTION add_cost(items1) -- function name = default col name
RETURNS numeric AS
$func$
SELECT
CASE
WHEN $1.labor < 100 AND $1.overhead < .20 THEN numeric '1'
-- WHEN .....
-- WHEN .....
-- WHEN .....
ELSE numeric '0' -- ?
END;
$func$
LANGUAGE sql IMMUTABLE;
呼叫:
SELECT *, t.add_cost FROM items1 t;
请注意t.add_cost
中的表格资格。我只展示了这种语法变体,因为你一直在要求它。我的建议是使用较少混淆的标准语法:
SELECT *, add_cost(t) AS add_cost FROM items1 t; -- column alias is also optional
然而,SQL是一种严格类型的语言。如果将特定行类型定义为输入参数,则它将绑定到此特定行类型。传递各种整表类型更复杂,但仍可以使用多态输入类型。
CREATE OR REPLACE FUNCTION add_cost(ANYELEMENT) -- function name = default col name
RETURNS numeric AS
$func$
SELECT
CASE
WHEN $1.labor < 100 AND $1.overhead < .20 THEN numeric '1'
-- WHEN .....
-- WHEN .....
-- WHEN .....
ELSE numeric '0' -- ?
END;
$func$
LANGUAGE sql IMMUTABLE;
对于具有匹配数据类型的列labor
和overhead
的任何表的相同调用。
dbfiddle here
另请参阅此处传递简单值的相关简单案例:
对于更复杂的要求 - 比如返回各种行类型 - 请参阅: