Проблема с передачей имени столбца в качестве параметра «ПОДГОТОВИТЬ» в Redshift - PullRequest
0 голосов
/ 07 мая 2019

Я использую REDSHIFT для приведенного ниже вопроса. Вот проблема, и я ищу решение.

У меня есть 2 таблицы, одна таблица содержит комбинации столбцов, по которым вторая таблица должна сгруппировать результаты.

Таблица 1, содержащая комбинации столбцов (Это вывод хранимой процедуры):

COMBINATIONS

fruit_combinations 
  banana,'ALL'  
  banana, orange

Таблица 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 $1,$2, 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?

1 Ответ

1 голос
/ 08 мая 2019

Это может теперь быть выполнено с использованием хранимых процедур без необходимости PREPARE. «Обзор хранимых процедур в Amazon Redshift»

Похоже, вы пытаетесь эмулировать функциональность GROUPING SETS или ROLLUP.Я добавил UNION ALL к динамическому SQL, чтобы обеспечить этот тип вывода.

В этом примере хранимой процедуры оба имени столбца предоставляются как входные данные, а 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 при вызове процедуры.При необходимости имена столбцов могут быть извлечены из таблицы другой хранимой процедурой.Затем извлеките вывод из REFCURSOR.

BEGIN; 
CALL get_fruit_sum ( 'Banana','Orange','result_set' ); 
FETCH ALL FROM result_set; 
END;
...