我有两个表,我试图在一个特定的列上连接在一起(在两者之间共享)。这些列中的数据应该代表数字,但数据实际上是字符,有些值是非数字的(例如' 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
答案 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