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

标签 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 的一部分添加到函数中,以便仅通过调用函数即可注入(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 函数。见:

根据您的需要调整输入和输出数据类型。由于缺乏信息,只能猜测 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 上的手册页开始.

SO 上还有许多相关问题和答案。

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

关于sql - 如何将 SELECT 语句的一部分放入 Postgres 函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46165108/

相关文章:

mysql - 选择日期在 X 个月内的位置,无论存储的年份如何

sql - 为什么 null 不在(1,2,3)中 false

database - 有什么好的方法可以实现与代码库同步的敏捷数据库过程,尤其是在持续集成方面?

mysql - 错误 2006 (HY000) 在第 2759 行 : MySQL server has gone away

python - 使用 Python 将 PostgreSQL 查询导出到 csv 文件

Django Postgres全文TrigramSimilarity Multiple Fields

c# - Entity Framework 错误地跨多个列强制执行唯一约束

php mysql连接使用

django - pg_restore 不恢复某个表?

c# - 使用 Windows Phone 8 连接到 Postgres 数据库