我有一个 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
的一部分添加到函数中,以便仅通过调用函数即可注入(inject)?
我正在通过文档和 Google 进行分类,如果使用 plpgsql
语言而不是 sql
创建函数,似乎是可能的。但是,我正在阅读的内容不是很清楚。
最佳答案
您不能将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
上的手册页开始.
SO 上还有许多相关问题和答案。
另请参阅此处传递整行的相关、更复杂的案例:
关于sql - 如何将 SELECT 语句的一部分放入 Postgres 函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46165108/