将FROM中使用的表名自动传递给函数?

时间:2017-09-11 22:00:28

标签: sql database postgresql function parameter-passing

使用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

看起来多余。

我确实遇到过一些主题,其中的标题听起来像是我们希望完成的内容,但在审核它们时,看起来它们是一个不同的问题。

1 个答案:

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

对于具有匹配数据类型的列laboroverhead的任何表的相同调用。

dbfiddle here

另请参阅此处传递简单值的相关简单案例:

对于更复杂的要求 - 比如返回各种行类型 - 请参阅: