2013-08-19 36 views
0

它似乎很簡單,但我試圖小時弄明白,但我不能..無法弄清楚如何寫一個簡單的DB2功能

我想創建一個DB2功能,就像聚結。

不同之處在於它尋找第一個參數的值,如果它是一個空字符串,它是''。然後它將使用第二個參數。

這就是我所做的

CREATE FUNCTION COALESCEEMPTY (X1 XML, X2 XML) 
RETURNS XML 
LANGUAGE SQL 
CONTAINS SQL 
NO EXTERNAL ACTION 
DETERMINISTIC 
CASE X1 
WHEN '' THEN RETURN X2; 
ELSE RETURN X1; 
END CASE; 

查詢,這是錯誤的代碼,我從DB2獲得。

16:09:47 [CREATE - 0 row(s), 0.000 secs] [Error Code: -104, SQL State: 42601] DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=X1 
WHEN '' THEN RETURN X2;ERMINISTIC 
CASE;<space>, DRIVER=4.13.127 
16:09:47 [ELSE - 0 row(s), 0.000 secs] [Error Code: -104, SQL State: 42601] DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=RETURN;ELSE ;JOIN <joined_table>, DRIVER=4.13.127 
16:09:47 [END - 0 row(s), 0.000 secs] [Error Code: -104, SQL State: 42601] DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=END-OF-STATEMENT;END CASE;JOIN <joined_table>, DRIVER=4.13.127 

感謝您的幫助。

回答

0

我只在Teradata上執行SQL UDF,但DB2語法非常相似。 這應該工作

CREATE FUNCTION COALESCEEMPTY (X1 XML, X2 XML) 
RETURNS XML 
LANGUAGE SQL 
CONTAINS SQL 
NO EXTERNAL ACTION 
DETERMINISTIC 
RETURN 
    CASE WHEN X1 = '' THEN X2 ELSE X1 END; 
+0

謝謝..剛試過。 16:30:28 [CREATE - 0 rows,0.000 secs] [錯誤代碼:-104,SQL狀態:42601] DB2 SQL錯誤:SQLCODE = -104,SQLSTATE = 42601,SQLERRMC = CASE;則X2 ELSE X1 END;結束語,驅動程序= 4.13.127 – Larry

+0

我剛剛檢查了DB2語法,並沒有END CASE END(從您的函數複製它),也許這就是問題所在。 – dnoeth

+0

不對。但接近.18:02:17 [CREATE - 0行,0.000秒] [錯誤代碼:-401,SQL狀態:42818] DB2 SQL錯誤:SQLCODE = -401,SQLSTATE = 42818,SQLERRMC = WHEN, DRIVER = 4.13.127 – Larry

0

空字符串不是良好的XML片段,因此它不應該是可能的一個XML主變量是一個空字符串。如果你的意思是檢查一個NULL值,因爲暗示的函數名,它應該看起來像

CASE WHEN X1 IS NULL THEN X2 ELSE X1 END 

在標準SQL NULL和空字符串是不同的東西。