奇数LEFT JOIN错误

时间:2014-09-04 17:27:29

标签: sql-server tsql sql-server-2008-r2

我有两个表,我试图在一个特定的列上连接在一起(在两者之间共享)。这些列中的数据应该代表数字,但数据实际上是字符,有些值是非数字的(例如' 2,3,4'或' n / a& #39)。我忽略了此列的非数字值的行。我在连接中将列视为数字,因为' 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

2 个答案:

答案 0 :(得分:2)

SQL Server不保证评估条件的顺序。在您的情况下,正在T1.ID + 0 = T2.ID + 0条件之前评估NOT LIKE

请尝试以下操作(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)

<强>参考

答案 1 :(得分: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