Db2中的数据类型转换

Db2中的数据类型转换,db2,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.

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

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
中工作得非常好,但在
db2z/os10.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版本需要做哪些更改。提前感谢。

首先,不管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\u列
与字符文字进行比较,这也将导致隐式转换。并非所有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\u列
与字符文字进行比较,这也将导致隐式转换。并非所有DB2平台都支持所有数据类型之间的隐式转换,因此再次强调,不要依赖它,而是使用显式转换。

您确定两个系统上的语句完全相同吗?错误消息表明语法不同,例如缺少撇号。您确定两个系统上的语句完全相同吗?错误信息表明语法有差异,例如缺少撇号。我理解你的观点。隐式转换在一个db2版本中工作正常,但在另一个版本中工作不正常[我再次尝试确认]。现在,正如您所建议的,我已经更改了代码,以便在需要时进行显式转换。它现在运转良好。谢谢,我明白你的意思。隐式转换在一个db2版本中工作正常,但在另一个版本中工作不正常[我再次尝试确认]。现在,正如您所建议的,我已经更改了代码,以便在需要时进行显式转换。它现在运转良好。谢谢