2014-09-04 192 views
1

我有兩個表我試圖加入到一個特定的列(兩者之間共享)。這些列中的數據應該表示數字,但數據實際上是字符,並且其中一些值是非數字的(例如'2,3,4'或'n/a')。我忽略了具有此列的非數字值的行。我治療的列數字的加入,因爲「001」必須匹配「1」,「01」,「0001」等內加入他們的作品,左外加入他們並不:奇數左連接錯誤

SELECT * 
FROM Table1 T1 
INNER JOIN Table2 T2 
    ON T1.ID NOT LIKE '%[^ 0-9]%' 
    AND T2.ID NOT LIKE '%[^ 0-9]%' 
    AND T1.ID + 0 = T2.ID + 0 
-- Success! 

SELECT * 
FROM Table1 T1 
LEFT JOIN Table2 T2 
    ON T1.ID NOT LIKE '%[^ 0-9]%' 
    AND T2.ID NOT LIKE '%[^ 0-9]%' 
    AND T1.ID + 0 = T2.ID + 0 
-- Conversion failed when converting the nvarchar value '2,3,4' to data type int. 

爲什麼我在外部連接上發生錯誤,而不是內部連接?

P.S .:修復數據是不是選項。這不是我的數據;我無法觸摸它。我必須找到一個方法來處理它。

編輯:我正在運行SQL Server 2008 R2 RTM

+1

所以要清楚,你會得到一個錯誤?或者你沒有得到你期望的數據?如果您收到錯誤,錯誤是什麼? – 2014-09-04 17:29:52

+0

'T1.ID + 0 = T2.ID + 0'應該做什麼?爲什麼不簡單地'T1.ID = T2.ID'? – wdosanjos 2014-09-04 17:37:38

+0

你在查詢中忘記了「外層」。 SELECT * FROM Table1 T1 LEFT Outer JOIN Table2 T2 on ... – 2014-09-04 17:39:29

回答

2

SQL Server不保證條件的評估順序。在你的情況下,在NOT LIKE條件之前正在評估T1.ID + 0 = T2.ID + 0

請嘗試以下方法(SQL 2012及以上):

SELECT * 
FROM Table1 T1 
LEFT JOIN Table2 T2 
    ON TRY_CAST(T1.ID AS int) = TRY_CAST(T2.ID AS int) 

SQL 2008:

SELECT * 
FROM (SELECT * FROM Table1 WHERE ID NOT LIKE '%[^ 0-9]%') T1 
LEFT JOIN (SELECT * FROM Table2 WHERE ID NOT LIKE '%[^ 0-9]%') T2 
    ON CAST(T1.ID AS INT) = CAST(T2.ID AS INT) 

參考

+0

在我的實際查詢中,兩端都有通配符('%');當我編寫示例時,我沒有添加它們。現在已經修復了。我檢查了我的版本,我正在使用SQL Server 2008 :( – 2014-09-04 17:45:20

+0

感謝您的實際答案(順序不能保證)和解決方案。您的SQL 2008解決方案適用於我的應用程序,在表1中增加了'OR ID IS NULL' )。 – 2014-09-04 17:56:43

1

如果您嘗試這樣做,而不是?它做你想做的事嗎?

SELECT * 
FROM Table1 T1 
LEFT JOIN Table2 T2 
    ON (isnumeric(T1.ID) = 1 
     AND isnumeric(T2.ID) = 1) 
     AND try_parse(T1.ID as int) + 0 = try_parse(T2.ID as int) + 0 
+0

ISNUMERIC使兩個查詢都失敗了,我想是因爲它認爲逗號是有效的。無論哪種方式,這可能會奏效,但我沒有訪問TRY_PARSE。 – 2014-09-04 17:51:40