Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 连接不同的数据类型_Sql_Sql Server - Fatal编程技术网

Sql 连接不同的数据类型

Sql 连接不同的数据类型,sql,sql-server,Sql,Sql Server,有没有办法比较两种不同类型的数据 例如,我试图使用两个不同的列来左连接两个表A和表B。表A的键是ProductNumber,它已作为文本输入数据库(我无法编辑),表B的键是StoreProductNumber,它是数字数据 如果我使用 a.ProductNumber上的左连接b,如b.StoreProductNumber 这能让我用这两个来加入吗 以前,当我在Access和SSMS中尝试时,我收到一个错误,其中提到了这两列是如何由不同类型的数据组成的。如果ProductNumber可以包含比St

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

例如,我试图使用两个不同的列来左连接两个表A和表B。表A的键是ProductNumber,它已作为文本输入数据库(我无法编辑),表B的键是StoreProductNumber,它是数字数据

如果我使用
a.ProductNumber上的左连接b,如b.StoreProductNumber
这能让我用这两个来加入吗


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

如果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

但是,为了清晰起见,我更喜欢显式地进行所有转换,因此我建议不要使用这种方法。

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

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

将storeProductNumber转换为VARCHAR,然后加入

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

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

要测试此功能,请尝试以下操作:

 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(商用现货)产品,并且您无法在不破坏许可证的情况下进行更改,则可能会出现许多代码问题,当然,您不能这样做。但是,如果可以的话,在数据库进行大量不必要的转换之前修复它是值得的。

检查您的
JOIN
syntax=您缺少表名和
上的
关键字感谢您捕捉到了这一点。添加了“b ON”:)没问题,但现在您正试图连接到表b,这是基于表b中两列的比较你知道这只是一个非功能性的部分代码行,概念证明,其中的关键元素是转换吗?首先:我的批评是建设性的,不是攻击。其次,是的,我意识到了这一点。然而,我希望你意识到,如果你花时间发布没有明显错误的答案(特别是当它只有一行的时候),你就不太可能被纠正。如果你要发布一个答案,就要努力确保它是正确的。不要偷懒。SQL可以比字符串更快地比较数字——因此我认为最好将文本转换为整数。这种差异几乎可以忽略不计,除非是对大量数据进行操作,但为了清晰起见,我想发表评论。@StanShaw:谢谢你提供的信息。:)回答得好,@HLGEM。然而,为了清晰起见,您认为显式转换更好吗?