2017-07-19 71 views
2

有什麼方法可以比較兩種不同類型的數據嗎?加入不同的數據類型

例如,我試圖使用兩個不同列來LEFT JOIN兩個表A和B.表A的關鍵是ProductNumber,它已被輸入到數據庫(我無法編輯)作爲文本,並且表B的關鍵字是StoreProductNumber,它是編號數據。

如果我使用 a LEFT JOIN b ON a.ProductNumber LIKE b.StoreProductNumber 這將允許我使用這兩個JOINING?

以前,當我在Access和SSMS中嘗試過時,我收到一個錯誤,提到兩列是如何由不同類型的數據組成的。

回答

3

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

但是,我更願意做所有的轉換明確爲清楚起見,所以我建議對這個做法。

0

嘗試使用CONVERT函數比較值。例如:

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

檢查你的'JOIN'語法=你缺少表名和'ON'關鍵字 –

+0

感謝你的支持。添加了「b ON」:) –

+0

沒問題 - 但現在你試圖加入表b - 基於表b中兩列的比較。 :) –

0

轉換storeProductNumber爲VARCHAR再加入

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

SQL可以比字符串更快地比較數字 - 所以我認爲將文本轉換爲整數會更好。這種差異幾乎可以忽略不計,除非對大量數據進行操作,但我想澄清一下。 –

+0

@StanShaw:謝謝你的信息。 :) –

3

在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(商業現成)產品,並且無法進行更改弄亂你的許可證,當然你不能這樣做。但是如果可以的話,在數據庫完成大量不必要的工作轉換之前,值得一段時間來修復它。

+0

很好的答案,@HLGEM。但是,您認爲明確的轉換更清晰嗎? –