我有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
,则可能会出现这种情况。但是,我正在阅读的内容并不是很清楚。
答案 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函数。参见:
根据需要调整输入和输出数据类型。只是因为缺乏信息而猜测integer
和numeric
。
呼叫:
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;在这里答案。
另请参阅此处传递整行的相关更复杂的案例: