无法弄清楚如何编写一个简单的DB2函数

时间:2013-08-19 15:17:42

标签: sql db2

看起来很简单,但我花了好几个小时才想出来,但我不能......

我希望创建一个类似于coalesce的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

感谢您的帮助。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

空字符串不是格式良好的XML片段,因此XML主机变量不应该是空字符串。如果您要检查函数名称所暗示的NULL值,它应该看起来像

CASE WHEN X1 IS NULL THEN X2 ELSE X1 END

在标准SQL中,空字符串是不同的东西。