加入不同的数据类型

时间:2017-07-19 13:43:51

标签: sql sql-server

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

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

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

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

4 个答案:

答案 0 :(得分:5)

如果ProductNumber可以包含多于StoreProductNumber:

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

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

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

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

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

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

LEFT JOIN b
on a.ProductNumber = b.StoreProductNumber

但是,为了清晰起见,我更愿意明确地进行所有转换,因此我建议不要这样做。

答案 1 :(得分:4)

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

https://docs.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(商业现货)产品,并且您无法进行更改弄乱你的许可证,当然你不能这样做。但是,如果可以的话,在您最终完成数据库执行大量不必要的工作转换之前,最好先修复它。

答案 2 :(得分:1)

将storeProductNumber转换为VARCHAR,然后转换为JOIN

SELECT * FROM a 
LEFT JOIN b ON a.ProductNumber =  CAST(b.StoreProductNumber as VARCHAR(MAX))

答案 3 :(得分:0)

尝试使用CONVERT函数比较值。例如:

    LEFT JOIN b ON a.ProductNumber = CONVERT(NVARCHAR(12), b.StoreProductNumber)