所以這就是我想要完成的。我有兩個表中的座標數據,我試圖用關聯表連接在一起。這是一對一的關聯,所以如果我在表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問題中的細節水平很差,可怕的做法... – 2013-04-11 14:03:58
我相信你指的是LIKE。我發現的關於這個問題的其他一切都涉及四捨五入,這大大減少了我創建關聯的成功。 – JoeManiaci 2013-04-11 14:08:02
閱讀完您的詳細解釋之後,我仍然不確定實際上您的比較究竟是基於什麼?由於我假設你想匹配具有「相似」值的記錄,計算兩個浮點值之間的差異不是更好嗎,然後根據差異小於X的值進行篩選? – CBroe 2013-04-11 14:25:57