Sql 是否自动将FROM函数中使用的表名传递给函数?
使用PostgreSQL 9.6.3。我不熟悉数据库中的函数 假设有多个项目编号表。每一列都有项目编号、项目成本和其他几个列,这些列被分解为“额外成本”。我想把计算放在一个函数中,这样我就可以为这些表中的任何一个调用它 因此,不是: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 ....
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
且数据类型匹配的任何表,调用相同
小提琴
另请参见此处传递简单值的相关简单案例:
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;