如何在执行 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 【问题描述】:我用谷歌搜索,但每个人都在询问如何传递表格或如何将返回结果用于函数;我都不想做。我只是想取一个表的列的值(假设下面的col2
是 text 数据类型),并将该数据传递给一个函数,这样我就可以操作数据,但是在 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 函数的主要内容,如果未能解决你的问题,请参考以下文章