连接不同的数据类型

新手上路,请多包涵

有没有办法比较两种不同类型的数据?

例如,我正在尝试使用两个不同的列来 LEFT JOIN 两个表 A 和 B。表 A 的键是 ProductNumber,它已作为文本输入到数据库中(我无法编辑) ,而表 B 的键是 StoreProductNumber,它是数字数据。

如果我使用 a LEFT JOIN b ON a.ProductNumber LIKE b.StoreProductNumber 这是否允许我使用这两个来加入?

以前,当我在 Access 和 SSMS 中尝试时,我收到一个错误,提到这两列是如何由不同类型的数据组成的。

原文由 nola94 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 542
2 个回答

如果 ProductNumber 可以包含比 StoreProductNumber 更多的内容:

 LEFT JOIN b
ON a.ProductNumber LIKE '%' + CAST(b.StoreProductNumber as varchar(n)) + '%'

显然,您可以修改 n 以确保您的 StoreProductNumber 不会被截断。

但是,如果保证它们是相同的(只是不同的数据类型),您可以直接比较它们:

 LEFT JOIN b
on CAST(a.ProductNumber as BIGINT) = b.StoreProductNumber

如果您不需要 BIGINT ,您可以使用 INT 或任何您需要的数据类型。

最后,正如 HLGEM 指出的那样,SQL 将为您进行隐式转换,因此从技术上讲,这也可以:

 LEFT JOIN b
on a.ProductNumber = b.StoreProductNumber

但是,为了清楚起见,我更喜欢明确地进行所有转换,所以我建议不要使用这种方法。

原文由 Stan Shaw 发布,翻译遵循 CC BY-SA 3.0 许可协议

在 SQL Server 中,如果数据类型可以隐式转换并且列不包含任何会导致转换问题的数据,则可以加入不同的数据类型。有关隐式转换的数据类型的参考,请参阅:

https://learn.microsoft.com/en-us/sql/t-sql/data-types/data-type-conversion-database-engine

要对此进行测试,请尝试以下操作:

  Create table #temp (test int)
 insert #temp values(1), (2)

 Create table #temp2  (test bigint)
 insert #temp2 values(1), (2)

 select * from #temp t join #temp2 t2 on t.test = t2.test

 Create table #temp3 (test int)
 insert #temp3 values(1), (2)

 Create table #temp4 (test varchar(10))
 insert #temp4 values('1'), ('test')

 select * from #temp3 t3 join #temp4 t4 on t3.test = t4.test

 Create table #temp5 (test int)
 insert #temp5 values(1), (2)

 Create table #temp6 (test varchar(10))
 insert #temp6 values('1'), ('2')

 select * from #temp5 t5 join #temp6 t6 on t5.test = t6.test

虽然您可以进行隐式转换,但您也可以显式转换,这可能会提高维护的清晰度。但是如果转换出现问题,显式转换将与隐式转换具有相同的结果:

  Create table #temp7 (test int)
 insert #temp7 values(1), (2)

 Create table #temp8 (test varchar(10))
 insert #temp8 values('1'), ('test')

 select * from #temp7 t7 join #temp8 t8 on t7.test = cast(t8.test as int)

我要指出,如果这两个字段应该包含相同类型的数据,最好的解决方案是修复不匹配。在遗留系统中,如果您进行更改或从由不同团队管理的两个不同数据库中提取,或者如果其中一个数据库是 COTS(商业现货)产品并且您无法在没有更改的情况下进行更改,则遗留系统可能会出现许多代码问题弄乱你的执照,你当然不能这样做。但是如果可以的话,在你最终让数据库做很多不必要的转换工作之前修复它是值得的。

原文由 HLGEM 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进