不同数据类型的 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)
我做了一些测试来重现您的问题(我猜测 IMUS15
和 CMCSNO
的定义):
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。
我必须使用具有 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)
我做了一些测试来重现您的问题(我猜测 IMUS15
和 CMCSNO
的定义):
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。