具有动态 SQL 语句的 Redshift UDF 函数

Posted

技术标签:

【中文标题】具有动态 SQL 语句的 Redshift UDF 函数【英文标题】:Redshift UDF function with dynamic SQLstatement 【发布时间】:2021-01-13 14:12:23 【问题描述】:

我对 Amazon redshift 非常陌生。我正在尝试通过添加多个列来创建 UDF 函数来创建列聚合,这是我尝试过的

CREATE OR REPLACE FUNCTION pp_calc(identifier varchar(100),table_name varchar(100))
RETURNS float 
stable 
as $$

BEGIN

IF identifier ='OC' THEN
  EXECUTE 'SELECT identifier'||_1 + || 'identifier' ||_2 || 'FROM ' || table_name /* I want to return this addition result */
ELSE 
  'SELECT identifier'||_1 + || 'identifier' ||_2 || 'FROM ' || table_name
END IF;

END;

$$ LANGUAGE sql;

我正在接近返回语句的错误。我确信语法有问题。我想根据要添加列的参数将标识符作为参数传递。

【问题讨论】:

我不知道 Redshift,但是在 Postgres 中只能在 PL/pgSQL 中使用动态 sql,而不能在 language sql 函数中使用 是的,我也试过了,我收到错误 [Amazon](500310) Invalid operation: language plpgsql not supported for CREATE FUNCTION; 【参考方案1】:

您需要使用存储过程来执行动态 SQL。见"Overview of Stored Procedures in Amazon Redshift"

CREATE PROCEDURE pp_calc(identifier varchar(100),table_name varchar(100))
RETURNS float  
AS $$
BEGIN
IF identifier ='OC' THEN
  EXECUTE 'SELECT '||identifier||'_1 + '||identifier||'_2 FROM '||table_name ;
/* I want to return this addition result */
ELSE
  EXECUTE 'SELECT '||identifier||'_1 + '||identifier||'_2 FROM '||table_name ;
END IF;
END;
$$ LANGUAGE plpgsql;

另请参阅上一个答案:Redshift: Executing a dynamic query from a string

【讨论】:

以上是关于具有动态 SQL 语句的 Redshift UDF 函数的主要内容,如果未能解决你的问题,请参考以下文章

我们应该在 Redshift 的存储过程中使用 udf

如何在 Redshift(亚马逊)中更新 UDF?

表名的 Redshift UDF?

在 Redshift UDF 中求和

Redshift UDF 逻辑问题

Redshift UDF 逻辑问题