【问题标题】:DB2 Matching on different data typesDB2 对不同数据类型的匹配
【发布时间】:2017-06-29 00:38:37
【问题描述】:

我必须使用具有join 字段但它们不匹配数据类型的表。一个是字符串,一个是十进制。 当我使用 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

【问题讨论】:

  • 您确定只加入 CMCSNO 的前 6 位数字吗?
  • @jamesallman 是的。该字段的长度只有 6 个字符。当我得到更改时,我将尝试您的解决方案,我必须手动将其组合在一起以满足需要。感谢您的建议!
  • 如果你不是特别需要SUBSTR,只需使用CHAR函数或隐式转换即可。

标签: python db2 ibm-midrange pyodbc


【解决方案1】:

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

【讨论】:

  • 您可能不必修剪 IMUS15,因为 DB2 for IBM 我将忽略比较时的尾随空格。而且,SUBSTR(CMCSNO,1,6) 将生成一个固定长度的字符串,可能带有尾随空格。
  • @jmarkmurphy 我做了一个快速测试,你是对的。我还注意到它默认将IMUS15 隐式转换为数字以进行比较。
  • @jamesallman 这行得通。不知道我怎么没想到那个,我猜是看不到森林。非常感谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    相关资源
    最近更新 更多