【问题标题】:How to pass a Tables Column into a plpgsql Functiion while performing a SELECT... statement如何在执行 SELECT... 语句时将表列传递给 plpgsql 函数
【发布时间】: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 太烂了,如果你回复答案,我会给你最好的答案

标签: postgresql plpgsql stored-functions


【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多