如何在执行 SELECT... 语句时将表列传递给 plpgsql 函数

Posted

技术标签:

【中文标题】如何在执行 SELECT... 语句时将表列传递给 plpgsql 函数【英文标题】:How to pass a Tables Column into a plpgsql Functiion while performing a SELECT... statement 【发布时间】:2021-10-17 03:37:07 【问题描述】:

我用谷歌搜索,但每个人都在询问如何传递表格或如何将返回结果用于函数;我都不想做。我只是想取一个表的列的值(假设下面的col2text 数据类型),并将该数据传递给一个函数,这样我就可以操作数据,但是在 SELECT... 语句本身,即

SELECT t.col1, "myCustomFunction"(t.col2)
FROM tbl t
WHERE t.col1 = 'someCondition';


CREATE OR REPLACE FUNCTION myCustomFunction(myArg text) 
RETURNS text AS $$
DECLARE 

BEGIN
     
      RETURN UPPER(myArg);

END
$$ LANGUAGE plpgsql;

...所以如果myCustomerFunction()的工作是大写字母(不是,只是一个例子),输出将是col2的表格数据全部大写。

这可能吗?我认为这与在其中嵌入 CASE 表达式没有什么不同,我知道它有效,并且函数返回结果,所以我认为它会是相同的,但是我收到 SQL 错误

【问题讨论】:

不可能。 @PavelStehule 太烂了,如果你回复答案,我会给你最好的答案 【参考方案1】:

您不能将命名列传递给某个函数,并且您不能返回此命名列,例如带有此列的表。该表是由行组成的,Postgres 中几乎所有的处理都是基于行处理的。通常你只需要在内存中保存一行的数据,这样你就可以处理比你的内存大得多的数据集。

在 PL/pgSQL 函数内部你没有关于外部的信息。您可以只获取标量类型、标量数组或复合或复合数组(或范围和多范围 - 这种特殊类型的复合和复合数组)的数据。没有别的了。

理论上您可以将一列中的数据聚合到数组中,然后您可以将此数组扩展为表格。但是这些操作会占用大量内存并且速度会很慢。你只在少数情况下需要它(例如计算中值函数),但它很慢,并且存在内存不足异常的风险。

【讨论】:

【参考方案2】:

当对象名称不加倍引用 Postgres 进程时,则在内部为小写。当双引号时,将完全按照引用的方式处理。问题是这些可能不一样。您将函数定义为FUNCTION myCustomFunction(myArg text) 没有双引号,但尝试通过 "myCustomFunction"(t.col2) 调用它。不幸的是,myCustomFunction 被处理为mycustomfunction,但"myCustomFunction" 的处理方式与它看起来完全一样。那些不一样。将您的选择更改为:

SELECT t.col1,myCustomFunction(t.col2)
FROM tbl t
WHERE t.col1 = 'someCondition'; 

或将函数定义更改为:

CREATE OR REPLACE FUNCTION "myCustomFunction"(myArg text) 
RETURNS text AS $$
DECLARE 
BEGIN    
      RETURN UPPER(myArg);
END
$$ LANGUAGE plpgsql;

【讨论】:

以上是关于如何在执行 SELECT... 语句时将表列传递给 plpgsql 函数的主要内容,如果未能解决你的问题,请参考以下文章

将列传递给 UDF

如何将多个数据框列传递给函数[重复]

如何将数据框列传递给scala函数

将表传递给 postgreSQL 函数,执行 select 语句,返回表

如何将两个数据框中的列传递给 Haversine 函数?

如何将表名作为参数传递给存储过程?