声明变量

问题描述:

在TSQL我可以定义像这样的变量:声明变量

DECLARE @Threshold AS int; 
SET @Threshold = 5; 

然后我就可以使用它像这样:

,COALESCE(
    CASE WHEN X >= @Threshold THEN A ELSE NULL END 
    ,CASE WHEN Y >= @Threshold THEN B ELSE NULL END 
) AS Bla 

类似可能的东西在Teradata上

+0

你是如何执行你的查询? SQL助手,BTEQ等? – Andrew

+0

查看http://developer.teradata.com/blog/dnoeth/2011/03/global-and-session-level-parameters-in-sql,但不要尝试使用QueryBand方法,它仍然存在缺陷。 – dnoeth

这是很常见的变量加载到CTE并引用CTE的SELECT语句:

WITH variables AS 
(
    SELECT 5 as thresholdmin, 10 as thresholdmax 
) 
SELECT CASE WHEN 6 BETWEEN thresholdmin and thresholdmax then 1 ELSE 0 END as thresholdCheck 
FROM variables 

您只需跨过加入该CTE放入其他表格(或派生表格)中,并与上面的Volatile表格做出相同的参考,但没有实际存储空间的膨胀。

使用sys_calendar一个例子:

WITH variables AS 
(
    SELECT DATE '2016-01-01' as minDate, DATE '2016-01-31' as maxDate 
) 
SELECT cal.calendar_date 
FROM sys_calendar.calendar cal, variables 
WHERE cal.calendar_date BETWEEN variables.minDate and variables.maxDate 
ORDER BY cal.calendar_date 

这是一个很好的解决方案,因为它会在支持的CTE(所以一切除了MySQL的)任何RDBMS工作。

+0

@ BillCram的已删除评论:我认为CTE路线与tsql中的变量用法更为同义。交给脚本的用户只需要在CTE声明的最上面(而不是通过sql查找)找到'5'并将其更改为'6'。如果您需要更强大且可重复的内容,请转至宏或程序。 – JNevill

你无法在典型的Teradata sql脚本中创建变量。相反,创建一个易变的表格并在表格中存储“变量”的值。然后在需要使用时从易失性表中查询值。这将是这个样子:

CREATE VOLATILE TABLE MyVariable 
(
VariableValue int 
) Primary index (VariableValue) 
ON COMMIT PRESERVE ROWS; 

INSERT INTO MyVariable(VariableValue) 
VALUES (5); 

SELECT COALESCE(
    CASE WHEN X >= VariableValue THEN 'A' ELSE NULL END 
    ,CASE WHEN Y >= VariableValue THEN 'B' ELSE NULL END 
) 
FROM YourTable, MyVariable; 

如果你决定把你的逻辑存储过程里面,那么你可以DECLARE变量。

下面是实际的变量声明规则: http://info.teradata.com/htmlpubs/DB_TTU_15_00/index.html#page/SQL_Reference/B035_1148_015K/ch08.143.035.html#ww593657

+0

我知道易变表,但你真的建议在案件陈述中使用它们吗?这将如何工作? – cs0815

+0

我用一个例子更新了我的答案。如果你习惯了其他的数据库,我会承认它看起来很麻烦。 –