用户在运行查询时设置的变量Teradata

时间:2015-06-09 12:21:01

标签: sql teradata

我有一个查询,检查三个表A,B和C中是否至少存在一行,我想检查theDate = myDate。我希望能够查看表是否包含特定日期的数据(myDate)。 我希望用户在运行查询时选择变量myDate。我怎么做?仅供参考:我正在使用Teradata:

查询:

SELECT 'A' AS "Table", CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END AS "True?"
WHERE EXISTS (SELECT * FROM A WHERE theDate=myDate) 

UNION ALL

SELECT 'B', CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END
WHERE EXISTS (SELECT * FROM B WHERE theDate=myDate) 

UNION ALL

SELECT 'C', CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END
WHERE EXISTS (SELECT * FROM C WHERE theDate=myDate)

3 个答案:

答案 0 :(得分:0)

我认为动态过程/宏将最符合您的要求。 编译以下程序:

REPLACE PROCEDURE your_proc (IN in_mydate DATE)
READS SQL DATA
DYNAMIC RESULT SETS 1
BEGIN
DECLARE stmt_str VARCHAR(60000);
DECLARE RESPONSE CURSOR WITH RETURN ONLY TO CLIENT FOR STMT;

-----------------------------------------------------------------------------------------------
-------------------------------- PROGRAM LOGIC ------------------------------------------------
-----------------------------------------------------------------------------------------------

        SET stmt_str =          'SELECT ''A'' AS "Table", CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END AS "True?"'
                                ||'WHERE EXISTS (SELECT * FROM A WHERE theDate='''||in_mydate||''')' 
                                ||'UNION ALL'
                                ||'SELECT ''B'', CASE WHEN COUNT(*) = 1 THEN ''Y'' ELSE ''N'' END'
                                ||'WHERE EXISTS (SELECT * FROM B WHERE theDate='''||in_mydate||''') '
                                ||'UNION ALL'
                                ||'SELECT ''C'', CASE WHEN COUNT(*) = 1 THEN ''Y'' ELSE ''N'' END'
                                ||'WHERE EXISTS (SELECT * FROM C WHERE theDate='''||in_mydate||''');';



PREPARE STMT FROM stmt_str;
OPEN RESPONSE;
DEALLOCATE PREPARE STMT;

END;

在此之后调用语句只需输入您的日期(作为输入参数)。输出将是您想要的选择查询的结果。

如果你使用宏,下面的代码会给你输出:

        REPLACE MACRO your_macro (mydate DATE)
        AS (
        SELECT 'A' AS "Table", CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END         AS "True?"
        WHERE EXISTS (SELECT * FROM A WHERE theDate=:myDate) 

        UNION ALL

        SELECT 'B', CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END
        WHERE EXISTS (SELECT * FROM B WHERE theDate=:myDate) 

        UNION ALL

        SELECT 'C', CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END
        WHERE EXISTS (SELECT * FROM C WHERE theDate=:myDate);
       );

由于

答案 1 :(得分:0)

您可以将“变量”放在单行易失性表中,然后在查询中加入该表:

create volatile table varTable
as (select <your date value> as thedate)
with data
on commit preserve rows
;

SELECT 'A' AS "Table", 
CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END AS "True?"
from
a inner join vartable
  on a.<date column> = vartable.thedate

答案 2 :(得分:0)

我发现在我看来简单的解决方案非常有效。 ?theDate是在运行查询之前由用户设置的变量。 (对我来说,其他解决方案的问题是我无权创建存储过程或宏)

SELECT 'A' AS "Table", CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END AS "True?"
WHERE EXISTS (SELECT * FROM A WHERE theDate=?theDate) 

UNION ALL

SELECT 'B', CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END
WHERE EXISTS (SELECT * FROM B WHERE theDate=?theDate) 

UNION ALL

SELECT 'C', CASE WHEN COUNT(*) = 1 THEN 'Y' ELSE 'N' END
WHERE EXISTS (SELECT * FROM C WHERE theDate=?theDate)