簡體   English   中英

iSeries DB2 SQL-使用CASE語句更新UDF中的變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM