加入相同的字段,不同的数据类型

Posted

技术标签:

【中文标题】加入相同的字段,不同的数据类型【英文标题】:Joining on same field, different data type 【发布时间】:2017-03-09 18:22:19 【问题描述】:

我正在尝试使用名为“凭证”的字段左连接同一服务器上的两个表,但使用不同的数据库。这些字段包含完全相同的数据,但存储为不同的数据类型。在表 a 上,凭证存储为 nvarchar,在表 b 上存储为 char。

当我运行我的查询时,我从表 b 中获得了很多用于凭证的空值。如果我分别对表运行查询,我可以看到表 b 中的值在连接查询中作为空值出现。

这里的任何帮助都是巨大的。

【问题讨论】:

你能添加一些示例数据和想要的结果吗? A.Acct# A.VOUCHER B.Acct# B.Voucher 123456789 UXXXXXXXX NULL NULL 123456789 UXXXXXXXX NULL NULL 以上是我目前收到的。期望表 b 值将填充相同的数据。这是我的加入:left join tableB on tableb.voucher = tablea.voucher。正如我之前提到的,相同的数据但不同的数据类型。 编辑您的问题,不要在评论部分添加其他详细信息:) 还添加实际查询、示例结果和相关表定义(这样我们可以看到数据类型) 【参考方案1】:

Char 类型附加了空格以填充列长度。您需要在加入时修剪 char 字段:

left join tableB on rtrim(tableb.voucher) = tablea.voucher

【讨论】:

我尝试了这个连接,但仍然得到相同的结果:left join #b on ltrim(rtrim(b.VOUCHER)) = ltrim(rtrim(#a.VOUCHER)) 我只尝试了上面建议的表 b 上的 rtrim,但仍然得到相同数量的空值。 您也可以尝试删除输入字符吗?我以前也有过这种情况。 我不确定我是否知道如何“移除输入字符”?任何建议都会有所帮助。 像这样:replace(rtrim(tableb.voucher), char(13), '')【参考方案2】:

这两种数据类型应该在大多数数据库中进行隐式转换。它不会关心 char 添加的空格。

有时即使看起来相同,数据也不相同。请参阅下面的 SQL Server 代码(我正在显示那些不使用 SQl Server 的结果集):

创建数据

create table #temp ( id varchar (10))
create table #temp2 (id char(10))
truncate table #temp2
insert into #temp values ('test1')
insert into #temp values ('test' +Char(13))
Insert into #temp2 values ('test1')
insert into #temp2 values ('test')

查询#temp

select * from #temp

数据返回

id
test1
test 

查询#Temp2

select * from #temp2

数据返回

id
test1     
test    

加入查询

select t.id as tid , t2.id as t2id from #temp t
left join #temp2 t2 on t.id = t2.id

数据返回

tid     t2id
test1   test1     
test    NULL

如您所见,如果您运行它,添加不可打印的字符(在本例中为回车)会使连接中的值不再匹配。如果您的表中有这样的数据,那么这些值就不一样了。为了更具体地修复,我必须知道您使用的是什么数据库后端。

【讨论】:

我正在使用 SQL Server Management Studio 2012。 这是否有帮助,或者您是否需要更多信息来建议特定的修复? 现在的问题是您是否需要清理数据本身(并对应用程序编写一个修复程序以防止不可打印的字符渗入)或者您是否需要将这些字符保留在有它们的表? 数据需要保持原样。我想我会问我是否可以在查询中做些什么来解决这个问题?? 任何变通方法都会成为性能杀手。但是替换功能将坏字符替换为空是您最好的选择。首先,您需要找出它们是什么,否则您将不得不替换从 char(1) 到 Char(32) 的每个字符。另一种选择是替换它们的功能,在互联网上搜索有很多不同的示例。但没有简单的解决办法。

以上是关于加入相同的字段,不同的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

从两个表中,把不同类型的字段查询连接在一起

MongoDB索引相同键的不同数据类型

修改字段名

如何对比两个相同数据库表的不同

使用 MySQL 表加入 LibreOffice 基表的建议

PL/SQL复合变量