我目前停留在将表中的三个字段连接成一个字符串。这三个字段具有不同的数据类型。
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版本需要进行哪些更改。提前谢谢。
答案 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平台都支持所有数据类型之间的隐式转换,因此请不要依赖它而是使用显式转换。