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

Posted

技术标签:

【中文标题】iSeries DB2 SQL - 使用 CASE 语句更新 UDF 中的变量【英文标题】:iSeries DB2 SQL - Update Variable in UDF Using CASE Statement 【发布时间】:2014-03-25 22:11:57 【问题描述】:

我正在尝试为 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。我想我可以在应用程序逻辑中处理这个问题,但这不是我想要的方式。

提前致谢。

【问题讨论】:

您可能希望显示函数的完整源代码,因为您包含的片段似乎没有有效的语法。 T-SQL 知识无法替代阅读actual manuals。另外,为什么要将整数值分配给 CHAR(1) 变量? @mustaccio,是的,语法在某些方面不正确。我根据 ibm 网站上的示例尝试了许多变体,但一直出错。如果我可以简单地让 case 语句起作用,我就可以处理完成函数的逻辑。然而,看起来 James 向我们展示了一种更好的日期转换方法。 【参考方案1】:

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

【讨论】:

谢谢詹姆斯,这比我走的路要简单得多。 UDF 现在工作了!【参考方案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 只是选择一个要返回的值。 (值是表达式的一种形式。)

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

【讨论】:

谢谢,我能够得到一个在函数中工作的 case 语句。这将在未来派上用场。

以上是关于iSeries DB2 SQL - 使用 CASE 语句更新 UDF 中的变量的主要内容,如果未能解决你的问题,请参考以下文章

使用 Iseries 上的 SQL DB2 从 WEB 获取 XML

DB2/iSeries SQL 清理 CR/LF、制表符等

Db2 iseries INSERT ON DUPLICATE KEY

DB2 for IBM i (iSeries) 日期 - 需要比较(当前日期 - 1)

DB2 版本的 SQL 差异

通过 Data Studio 为 DB2 for IBM i (iSeries) 构建存储过程失败