不同数据类型的 DB2 匹配

DB2 Matching on different data types

我必须使用具有 join 字段但它们不匹配数据类型的表。一个是字符串,一个是小数。 当我 select 他们使用 pyodbc sql 查询时,我可以使用以下方法让他们得到 return 相同的结果:

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

table 中某处的 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)

我做了一些测试来重现您的问题(我猜测 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。