[英]iSeries DB2 SQL - Update Variable in UDF Using CASE Statement
我試圖為DB2創建用戶定義的函數,但無法弄清楚。 我對t-sql更加滿意,它可以用大約十二種方法來完成。 我需要幫助,因為我得到的都是神秘的錯誤消息,告訴我沒有有效的令牌或類似的令牌。
基本前提是,我試圖將正常日期轉換為整個數據庫中使用的日期格式(cyymmdd),這里是偽代碼:
Get current time;
If YEAR(current time) > 1999 then 1 else 0;
很簡單吧? 無法正常工作。 這是實際的代碼:
DECLARE Cn CHAR ( 1 ) ;
CASE
WHEN YEAR(X) > 1999
THEN SET Cn = 1;
ELSE SET Cn = 0;
還嘗試了:
DECLARE Cn CHAR ( 1 ) ;
CASE YEAR(X)
WHEN > 1999
THEN SET Cn = 1;
ELSE SET Cn = 0;
那樣就失敗了。
我真的不知道如何使用SQL將3/25/2014轉換為1140325。 我想我可以在應用程序邏輯中處理此問題,但這不是我要使用的方法。
提前致謝。
這是將DATE轉換為CYMD的簡單計算:
SELECT (YEAR(CURRENT_DATE) - 1900) * 10000
+ MONTH(CURRENT_DATE) * 100
+ DAY(CURRENT_DATE)
FROM SYSIBM.SYSDUMMY1;
用於執行轉換的UDF:
CREATE FUNCTION QGPL.DATE2CYMD(DATE DATE) RETURNS DEC(7)
LANGUAGE SQL
DETERMINISTIC
BEGIN
RETURN (YEAR(DATE) - 1900) * 10000
+ MONTH(DATE) * 100
+ DAY(DATE);
END
驗證其正常工作的測試:
SELECT
QGPL.DATE2CYMD(CURRENT_DATE) CURRENT_CYMD,
QGPL.DATE2CYMD(CAST(NULL AS DATE)) NULL_CYMD
FROM SYSIBM.SYSDUMMY1;
在大多數情況下,您可以將CASE
看作是一個函數。 一個CASE
結構選擇一個表達式 ; 它不執行語句。 實際上,它以函數或任何表達式的形式返回值。
以下是一些編碼變體,所有這些變體都會導致MYCENT設置為“ 1”或“ 0”:
DECLARE MYCENT CHAR ( 1 ) ;
DECLARE MYYEAR BIGINT ;
SET MYYEAR = YEAR ( CURRENT DATE ) ;
SET MYCENT = CASE WHEN MYYEAR > 1999 THEN '1' ELSE '0' END ;
or
IF ( MYYEAR > 1999 )
THEN SET MYCENT = '1' ;
ELSE SET MYCENT = '0' ;
END IF ;
SET MYCENT = CASE WHEN YEAR(CURRENT DATE) > 1999 THEN '1' ELSE '0' END ;
請注意,這兩個CASE示例都使用單個WHEN...THEN...
子句,但是您可以根據需要設置多個子句。 還要注意,使用IF
在每個分支中都有一個SET
語句,但是CASE
只是選擇要返回的值。 (該值是一種表達形式 。)
作為SQL的語法元素, CASE
被稱為case-expression 。 作為表達式 ,通常可以在變量可能有效的地方使用CASE
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.