如何将SELECT语句的一部分放入Postgres函数中

时间:2017-09-11 22:20:50

标签: sql database postgresql function plpgsql

我有SELECT语句的一部分,这是一组非常冗长的条件语句。我想将它放入一个函数中,这样我就可以在任何需要使用它的表上更有效地调用它。

所以而不是:

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;

是否可以将SELECT的一部分添加到函数中,以便只需调用函数即可注入?

我正在对文档和Google进行排序,如果使用plpgsql语言创建函数而不是sql,则可能会出现这种情况。但是,我正在阅读的内容并不是很清楚。

1 个答案:

答案 0 :(得分:2)

您不能将SELECT语句的任何部分包装到函数中。但是像CASE这样的表达式很容易被包装:

CREATE OR REPLACE FUNCTION  pg_temp.calc_add_cost(_labor integer, _overhead numeric)
  RETURNS numeric AS
$func$
SELECT 
    CASE 
        WHEN _labor < 100 AND _overhead < .20 THEN numeric '1'  -- example value
--      WHEN .....
--      WHEN .....
--      WHEN .....
        ELSE numeric '0'  -- example value
    END;
$func$
  LANGUAGE sql IMMUTABLE;

虽然 也可以使用PL / pgSQL,但演示是一个简单的SQL函数。参见:

根据需要调整输入和输出数据类型。只是因为缺乏信息而猜测integernumeric

呼叫:

SELECT calc_add_cost(1, 0.1);

在你的陈述中:

SELECT 
    itemnumber, 
    itemname, 
    base, 
    calc_add_cost(labor, overhead) AS add_cost,  -- pass column values as input
    gpm
FROM items1;

你应该了解一些关于Postgres功能的基础知识,以便正确使用。可以从CREATE FUNCTION上的手册页开始。

还有许多与相关的问题&amp;在这里答案。

另请参阅此处传递整行的相关更复杂的案例: