2013-04-11 41 views
2

所以這就是我想要完成的。我有兩個表中的座標數據,我試圖用關聯表連接在一起。這是一對一的關聯,所以如果我在表A中有40條記錄,在表B中有40條記錄,那麼我應該在關聯表中有40條記錄。當不需要舍入時使用LIKE匹配花車

現在這兩張表中的數據大致相同,但從來不是理想的,事實上他們很少有相同的精度。一個表(我們會說A)總是有6個小數位,而B表可能沒有小數位或6個小數位。

假設我們只是匹配一對數據,比如表A中的12.345678與表B中的12.345678,以及12.34。

所以我有一個在我的asp.net代碼的foreach強制零到表B數據的末尾,所以我們首先比較12.345678和12.340000。

然後12.34567對,12.34000。 Then 12.3456 against,12.3400 Then 12.345 against,12.340

Then Then 12.34,against,12.34。

只要關聯記錄尚不存在,包含對錶A中12.345678或表B中12.34的引用,就會創建一個新的關聯記錄。

現在你可能會問喬,那麼你如何比較表A中的數據和表B中的數據呢?我最後保存了這部分,因爲它是最奇怪的。

我正在使用LIKE,我相信這會讓一些人感到不安,因爲你已經在想「爲什麼在地獄中你使用LIKE,這是爲了漂浮的字符串匹配?

那麼,因爲它迄今爲止效果最好,大約95%的時間。其他5%的大部分僅僅是因爲數據太不同了,但有一個非常奇怪的子集絕大多數應該是匹配的。

因此,在我插入記錄之前,我檢查匹配,只要我只有一個匹配,我創建關聯記錄。

SELECT COUNT(*) FROM dbo.StartCoord 

WHERE StartLatitude LIKE '12.817%' 
AND StartLongitude LIKE '12.819%' 

現在,我期待他現在在哪裏了12.817和12.819來自的記錄,以及完整的價值實際上是12.8179和12.8199。所以它可以發揮作用,並且95%的時間都可以工作。

現在對於奇怪的部分,也許,使用LIKE(應該只用於字符串匹配)導致SQL Server在後臺舍入。我上面的語句不工作,但如果我把它扔在Microsoft SQL Server管理,並改變它......

SELECT COUNT(*) FROM dbo.StartCoord 

WHERE StartLatitude LIKE '12.817%' --trying to string match 12.8179 
AND StartLongitude LIKE '12.82%' --trying to string match 12.8199 

...它的作品!

我假設有人會說它實際上不是LIKE,但是我將LIKE '12.817%'與浮點數進行比較並且該浮點數正在導致SQL Server制定一些舍入機制。

但是,如果是這樣的話,爲什麼LIKE '12.817%'與原來的12.8179相匹配呢?它是否應該不是圓整的,只有在12.82的情況下才匹配?

閱讀完這篇文章後,如果有人有更好的標題,我可以用於未來的其他人有同樣的問題,這將是偉大的。

謝謝。

編輯:所以我完全忘了提及爲什麼採取這種方法。在一張表中,實際的真值數據存儲在小數點後六位,我想我一直用作表A的一個例子。然而,表B中的數據從小數位到六位有時會變圓,有時不變。

所以在表A中我們可能有12.123456,在某些情況下,他們給我們表B的數據可能是12.1234或有時可能是12.1235。他們如何給我們提供數據並不一致,這就是爲什麼我以這種方式解決問題的原因。使用四捨五入或者轉換(數字)來處理這兩種情況都會導致創建更少的關聯,但我只開始嘗試使用該關聯。我還發現了一個我有興趣查看的STR()函數。

+1

+1問題中的細節水平很差,可怕的做法... – 2013-04-11 14:03:58

+0

我相信你指的是LIKE。我發現的關於這個問題的其他一切都涉及四捨五入,這大大減少了我創建關聯的成功。 – JoeManiaci 2013-04-11 14:08:02

+2

閱讀完您的詳細解釋之後,我仍然不確定實際上您的比較究竟是基於什麼?由於我假設你想匹配具有「相似」值的記錄,計算兩個浮點值之間的差異不是更好嗎,然後根據差異小於X的值進行篩選? – CBroe 2013-04-11 14:25:57

回答

2

如果您不想從使用LIKE更改。你可以將浮點數轉換爲小數點,然後轉換爲nvarchar,這應該停止舍入問題。

SELECT COUNT(*) FROM dbo.StartCoord 
WHERE CAST(CAST(StartLatitude as DECIMAL(12,6)) as nvarchar(20)) LIKE '12.817%' 
AND CAST(CAST(StartLongitude as DECIMAL(12,6)) as nvarchar(20)) LIKE '12.819%' 

我假定有6位小數是你需要的。

+0

現在這個工作,但我不能upvote它。我會把這個工作以及我可能能夠工作的一些效率。試圖採取馬克的領先優勢,並尋找良好的關係數據庫編碼實踐,因爲我顯然做錯了什麼。 – JoeManiaci 2013-04-11 16:28:41