2017-02-20 37 views
1

Я хочу передать некоторую переменную в запросе и использовать результирующий набор в инструменте отчетности, например, в виде пятна.Параметр в teradata

select prod_id,sum(sal) 
from cal c 
where qtr_num in (:q) 
group by 1 
having sum(sal)>0; 

: д может быть одно значение ('Q1') или несколько значений ('Q1', 'Q2', 'Q3', 'Q4'), а также.

Я знаю, что мы можем использовать макрос в виде параметров. но мы не можем использовать набор результатов, возвращаемый этим макросом, в инструменте select part/reporting.

Другой вариант - создать представление без фильтра, а затем использовать этот вид с фильтром параметров.

create view v 
as 
(select prod_id,sum(sal) 
from cal c 
group by 1 
having sum(sal)>0); 

    select * 
    from v 
    where qtr_num in (:q); 

, но этот подход может пропустить доступ раздел (созданный на qtr_num) и неэффективный способ запроса на мой взгляд. Этот запрос предназначен только для демонстрации. фактический запрос намного сложнее этого.

Есть ли способ достичь этого в терадате?

+0

I возился с использованием метода strtok_split_to_table, который, вероятно, сработал бы, однако это вызвало крах в моей системе ... поэтому я бы посоветовал это сделать. – JNevill

ответ

1

Как я уже упоминал в комментариях, я занимался strtok_split_to_table в качестве решения для разграничения списков значений в записи и затем использовать этот источник для фильтрации запроса. У меня есть свалка для моих усилий, но я решил, что поделюсь своими мыслями здесь, если это поможет привести к чему-то менее подверженному краху. Возможно, любая проблема, которую я ударил, разрешена в 15.10.

Filtering поле f1 в таблице test в представлении с использованием параметра :q, который представляет собой список значений, разделенных запятыми (это работает отлично, пока не будет забита в представление, так что, возможно, макрос будет вести себя лучше:

CREATE VIEW test_view AS 
SELECT * 
FROM test 
WHERE test.f1 in 
    (
     SELECT d.token 
     FROM TABLE 
      (
       strtok_split_to_Table(1, :q, ',') 
       RETURNS (outkey integer, tokennum integer, token varchar(20) character set unicode) 
      ) d 
    );