DB2对不同数据类型的匹配

时间:2017-06-27 16:58:57

标签: python db2 ibm-midrange pyodbc

我必须拥有join字段的表,但它们不匹配数据类型。一个是String,一个是Decimal。 当我使用pyodbc sql查询选择它们时,我可以使用以下命令让它们返回相同的结果:

int(trim(imus15))

int(substr(cmcsno, 1, 6))

但是,当我运行此连接时出现以下错误:

[DB2 for i5/OS]SQL0802 - Data conversion or data mapping error. (-802) 

我试过了:

CAST(TRIM(IMUS15 AS INTEGER)) = int(substr(cmcsno, 1, 6))

我无法确定如何加入这两个字段。

IMUS15会= '112303 '

CMCSNO = 112303

2 个答案:

答案 0 :(得分:3)

表格中某处的IMUS15字段中存在非数字值。

最快的解决方案是明确的字符比较:

JOIN TABLE2 ON IMUS15 = CHAR(CMCSNO)

例如:

WITH TABLE1 AS (SELECT '112303      ' IMUS15 FROM SYSIBM.SYSDUMMY1),
TABLE2 AS (SELECT 112303 CMCSNO FROM SYSIBM.SYSDUMMY1)
SELECT * FROM TABLE1
JOIN TABLE2 ON IMUS15 = CHAR(CMCSNO)

答案 1 :(得分:1)

我做了一些测试来重现您的问题(我猜测IMUS15CMCSNO的定义):

create table jmmlib.table1
  (imus15   char(15),
   data1    char(25));

create table jmmlib.table2
  (cmcsno   dec(6,0),
   data1    char(25));

insert into jmmlib.table1
  values ('123456', 'test key 1'),
         ('1123a', 'non-numeric key'),
         ('555', 'short key');

insert into jmmlib.table2
  values (123456, 'numeric key 1'),
         (1123, 'no valid match'),
         (555, 'short numeric key');

select * 
  from jmmlib.table1
  full outer join jmmlib.table2 on imus15 = char(cmcsno);

结果是:

IMUS15          DATA1             CMCUSNO   DATA1
--------------  ----------------  --------  -----------------
123456          test key 1        123,456   numeric key 1            
1123a           non-numeric key   <null>    <null>
555             short key         555       short numeric key        
<null>          <null>            1,123     no valid match           

注意,您需要做的就是将CMCSNO转换为角色,不需要其他旋转。

产生SQL0802的方法 - 数据转换或数据映射错误:

join on imus15 = cmcsno

join on trim(imus15) = cmcsno

join on dec(imus15,6,0) = cmcsno

在所有这些中,转换(隐式或显式)是imus15 to decimal,其中非数字键导致SQL0802。

相关问题