Db2中的数据类型转换

时间:2014-03-03 18:51:29

标签: db2

我目前停留在将表中的三个字段连接成一个字符串。这三个字段具有不同的数据类型。

Select 
    CASE COALESCE(CHAR_COLUMN,'XXX') WHEN 'XXX' 
        THEN 'CHAR_COLUMN is null' 
    else 'CHAR_COLUMN='''||CHAR_COLUMN||'''' END
    ||' and '||
    CASE COALESCE(DT_COLUMN,TIMESTAMP('1980-01-01-00.00.00')) 
        WHEN TIMESTAMP('1980-01-01-00.00.00') THEN 'DT_COLUMN is null' 
    else 'DT_COLUMN='''||DT_COLUMN||'''' END
    ||' and '||
    CASE COALESCE(NUM_COLUMN,111) WHEN 111 
        THEN 'NUM_COLUMN is null' 
    else 'NUM_COLUMN='''||NUM_COLUMN||'''' END
from 
S_DATATABLE

这在DB2/AIX64 9.1.7中完全正常,但在DB2 z/OS 10.1.5中则不然 错误
当单独运行数字列

An unexpected token ",111" was found following ",111".  Expected tokens may include:  "CONCAT || / MICROSECONDS MICROSECOND SECONDS SECOND MINUTES".  SQLSTATE=42601

单独为日期列

运行时
SQL0171N  The data type, length or value of the argument for the parameter in position "2" of routine "||" is incorrect. Parameter name: "||".  SQLSTATE=42815       

请建议对此DB2版本需要进行哪些更改。提前谢谢。

1 个答案:

答案 0 :(得分:4)

首先,无论DB2版本连接都需要字符操作数;您不能连接字符串和整数 - DB2将尝试将非字符数据类型隐式转换为字符。最好是进行显式转换以避免错误。

其次,您的SQL似乎不必要地复杂。而不是

CASE COALESCE(NUM_COLUMN,111) 
     WHEN 111 
        THEN 'NUM_COLUMN is null' 
     else 'NUM_COLUMN='''||NUM_COLUMN||'''' 
END

你可以这样做:

CASE WHEN NUM_COLUMN IS NULL 
        THEN 'NUM_COLUMN is null' 
     ELSE 'NUM_COLUMN='||VARCHAR(NUM_COLUMN)
END

请注意,在原始代码中,您将NUM_COLUMN与字符文字进行比较,这也会导致隐式转换。并非所有DB2平台都支持所有数据类型之间的隐式转换,因此请不要依赖它而是使用显式转换。