在 Redshift 中将列名作为参数传递给 "PREPARE" 的问题
Issue with passing column name as a parameter to "PREPARE" in Redshift
我正在使用 REDSHIFT 解决以下问题,这是问题所在,我正在寻找解决方案。
我有 2 个 table,一个 table 包含列组合,第二个 table 应该根据这些组合对结果进行分组。
Table 1 个包含列组合(这是存储过程的输出):
COMBINATIONS
fruit_combinations
banana,'ALL'
banana, orange
Table 2个包含fruit_baskets:
FRUIT_BASKET
BANANA ORANGE USER_COUNT
b1 o1 5
b1 o2 10
结果集:
FRUIT_BASKET_AGG
BANANA ORANGE USER_COUNT
b1 'ALL' 15
b1 o1 5
b1 o2 10
在 Redshift 中尝试过的解决方案:
PREPARE executesql(VARCHAR(10),VARCHAR(10))
AS
select ,, sum(fb.user_Count) as user_count
from dv_product.fruit_basket fb
group by 1,2;
EXECUTE executesql("BANANA","ORANGE") ;
DEALLOCATE executesql;
Error: [Amazon](500310) Invalid operation: column "banana" does not exist;
问题:
1 - 有没有办法将列名作为参数传递给 sql 语句并执行 sql?
2 - 在 Redshift 中实现上述结果集的其他替代方法是什么?
这可以现在 使用存储过程完成,而不需要 PREPARE
。 "Overview of Stored Procedures in Amazon Redshift"
您似乎在尝试模拟 GROUPING SETS
或 ROLLUP
功能。我在动态 SQL 中添加了一个 UNION ALL
来提供这种类型的输出。
对于此示例存储过程,两个列名都作为输入提供,REFCURSOR
声明为输出。
CREATE PROCEDURE get_fruit_sum(IN column_1 VARCHAR, IN column_2 VARCHAR, result_set INOUT REFCURSOR) AS $$
BEGIN
OPEN result_set FOR
EXECUTE 'SELECT '|| quote_ident(column_1) ||' , '|| quote_ident(column_2)
|| ' , SUM(fb.user_Count) as user_count '
|| 'FROM dv_product.fruit_basket fb GROUP BY 1,2'
|| 'UNION ALL '
|| 'SELECT '|| quote_ident(column_1) ||' , ''ALL'''
|| ' , SUM(fb.user_Count) as user_count '
|| 'FROM dv_product.fruit_basket fb GROUP BY 1;'
RETURN;
END;
$$ LANGUAGE plpgsql;
调用过程时指定列和输出 REFCURSOR。如果需要,可以通过另一个存储过程从 table 中检索列名。然后从 REFCURSOR 获取输出。
BEGIN;
CALL get_fruit_sum ( 'Banana','Orange','result_set' );
FETCH ALL FROM result_set;
END;
我正在使用 REDSHIFT 解决以下问题,这是问题所在,我正在寻找解决方案。
我有 2 个 table,一个 table 包含列组合,第二个 table 应该根据这些组合对结果进行分组。
Table 1 个包含列组合(这是存储过程的输出):
COMBINATIONS
fruit_combinations
banana,'ALL'
banana, orange
Table 2个包含fruit_baskets:
FRUIT_BASKET
BANANA ORANGE USER_COUNT
b1 o1 5
b1 o2 10
结果集:
FRUIT_BASKET_AGG
BANANA ORANGE USER_COUNT
b1 'ALL' 15
b1 o1 5
b1 o2 10
在 Redshift 中尝试过的解决方案:
PREPARE executesql(VARCHAR(10),VARCHAR(10))
AS
select ,, sum(fb.user_Count) as user_count
from dv_product.fruit_basket fb
group by 1,2;
EXECUTE executesql("BANANA","ORANGE") ;
DEALLOCATE executesql;
Error: [Amazon](500310) Invalid operation: column "banana" does not exist;
问题:
1 - 有没有办法将列名作为参数传递给 sql 语句并执行 sql?
2 - 在 Redshift 中实现上述结果集的其他替代方法是什么?
这可以现在 使用存储过程完成,而不需要 PREPARE
。 "Overview of Stored Procedures in Amazon Redshift"
您似乎在尝试模拟 GROUPING SETS
或 ROLLUP
功能。我在动态 SQL 中添加了一个 UNION ALL
来提供这种类型的输出。
对于此示例存储过程,两个列名都作为输入提供,REFCURSOR
声明为输出。
CREATE PROCEDURE get_fruit_sum(IN column_1 VARCHAR, IN column_2 VARCHAR, result_set INOUT REFCURSOR) AS $$
BEGIN
OPEN result_set FOR
EXECUTE 'SELECT '|| quote_ident(column_1) ||' , '|| quote_ident(column_2)
|| ' , SUM(fb.user_Count) as user_count '
|| 'FROM dv_product.fruit_basket fb GROUP BY 1,2'
|| 'UNION ALL '
|| 'SELECT '|| quote_ident(column_1) ||' , ''ALL'''
|| ' , SUM(fb.user_Count) as user_count '
|| 'FROM dv_product.fruit_basket fb GROUP BY 1;'
RETURN;
END;
$$ LANGUAGE plpgsql;
调用过程时指定列和输出 REFCURSOR。如果需要,可以通过另一个存储过程从 table 中检索列名。然后从 REFCURSOR 获取输出。
BEGIN;
CALL get_fruit_sum ( 'Banana','Orange','result_set' );
FETCH ALL FROM result_set;
END;