iSeries DB2 SQL - 使用CASE语句在UDF中更新变量

时间:2014-03-25 22:11:58

标签: sql db2 user-defined-functions ibm-midrange 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。我想我可以在应用程序逻辑中处理这个问题,但这不是我想要的方式。

先谢谢。

2 个答案:

答案 0 :(得分:6)

将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;

result

答案 1 :(得分:2)

在大多数情况下,您可以将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语句,但CASE只选择要返回的值。 (该值是表达式的一种形式。)

作为SQL的语法元素,CASE被称为 case-expression 。作为表达式,您通常可以在变量可能有效的任何地方使用{{1}}。