在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上
在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上
这是很常见的变量加载到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工作。
@ 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
我知道易变表,但你真的建议在案件陈述中使用它们吗?这将如何工作? – cs0815
我用一个例子更新了我的答案。如果你习惯了其他的数据库,我会承认它看起来很麻烦。 –
你是如何执行你的查询? SQL助手,BTEQ等? – Andrew
查看http://developer.teradata.com/blog/dnoeth/2011/03/global-and-session-level-parameters-in-sql,但不要尝试使用QueryBand方法,它仍然存在缺陷。 – dnoeth