Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否自动将FROM函数中使用的表名传递给函数?_Sql_Database_Postgresql_Function_Parameter Passing - Fatal编程技术网

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

Sql 是否自动将FROM函数中使用的表名传递给函数?,sql,database,postgresql,function,parameter-passing,Sql,Database,Postgresql,Function,Parameter Passing,使用PostgreSQL 9.6.3。我不熟悉数据库中的函数 假设有多个项目编号表。每一列都有项目编号、项目成本和其他几个列,这些列被分解为“额外成本”。我想把计算放在一个函数中,这样我就可以为这些表中的任何一个调用它 因此,不是: SELECT itemnumber, itemname, base, CASE WHEN labor < 100 AND overhead < .20 THEN WHEN ....

使用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;
如果我想在任何
表上使用它,我想我需要设置函数所采用的
表名
参数,因为至少可以说,将表名添加到函数中是不可取的

calc_add_cost(items1)
但是,是否有一种更简单的方法,当我调用
calc\u add\u cost()
时,它将只使用
from
子句中的表名

SELECT ....., calc_add_cost(item1) FROM item1
似乎是多余的

我确实遇到过一些主题,它们的标题听起来像是针对我希望实现的目标,但在回顾它们时,它们似乎是另一个问题。

你甚至可以模仿你心目中的“计算字段”或“生成列”。这里的基本知识:

一张桌子的简单演示:

注意
t.add\u 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;
创建或替换函数add\u cost(ANYELEMENT)——函数名=默认列名
将数字返回为
$func$
挑选
案例
当$1.0人工<100且$1.0管理费<.20时,则数字“1”
--当。。。。。
--当。。。。。
--当。。。。。
其他数字“0”-?
结束;
$func$
语言sql不可变;
对于包含列
labour
header
且数据类型匹配的任何表,调用相同

小提琴

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

有关更复杂的要求(如返回各种行类型),请参阅:

您甚至可以像想象的那样模拟“计算字段”或“生成列”。这里的基本知识:

一张桌子的简单演示:

注意
t.add\u 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;
创建或替换函数add\u cost(ANYELEMENT)——函数名=默认列名
将数字返回为
$func$
挑选
案例
当$1.0人工<100且$1.0管理费<.20时,则数字“1”
--当。。。。。
--当。。。。。
--当。。。。。
其他数字“0”-?
结束;
$func$
语言sql不可变;
对于包含列
labour
header
且数据类型匹配的任何表,调用相同

小提琴

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

有关更复杂的要求(如返回各种行类型),请参阅:


您可以考虑传递行,或者甚至只是两个PARAM值,例如:“CalcIdAddioCube”(劳动力,开销)。如果你得到表,你必须重新查询它(然后你需要知道要使用哪一行…..)你可以考虑传递行,或者甚至只是两个PARAM值,比如“CalcCyAddioCube(劳动力,开销)”。如果得到表,则必须重新查询它(然后需要知道要使用哪一行..)
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;