teradata

时间:2017-02-20 06:36:13

标签: sql teradata

我想在查询中传递一些变量,并且需要在报告工具中使用结果集,例如spotfire。

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

:q可以是单值('Q1')或多个值('Q1','Q2','Q3','Q4')。

我知道我们可以使用宏作为参数视图。但我们不能在选择部件/报告工具中使用该宏返回的结果集。

其他选项是创建不带过滤器的视图,然后将该视图与参数过滤器一起使用。

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上创建)和我认为的低效查询方式。此查询仅用于演示目的。实际查询比这复杂得多。

有没有办法在teradata中实现这一目标?

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,我正在修补strtok_split_to_table作为将分隔的值列表拆分为记录的解决方案,然后使用该源过滤查询。我为我的努力获得了一个崩溃转储,但我想我会在这里分享我的想法,以防它有助于减少崩溃。也许我遇到的任何问题都在15.10中得到解决。

使用参数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
    );