2017-04-19 315 views
0

在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

回答

0

這是很常見的變量加載到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

0

你無法在典型的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

我用一個例子更新了我的答案。如果你習慣了其他的數據庫,我會承認它看起來很麻煩。 –