我试图获得存在于一个表中而不是另一个表中的所有值。连接它们的条件在一个表中是varchar,在另一个表中是bigInt (swmItems是bigInt, OBJ_TAB是varchar)。我尝试了以下操作:
SELECT si.upc as upc from swmItems si
left outer join dbo.OBJ_TAB obj on cast(obj.F01 as BIGINT) = si.upc
WHERE obj.F01 IS NULL
然而,它给我的错误:"错误转换数据类型varchar到bigint"。
我还尝试了以下操作:
SELECT * FROM OBJ_TAB WHERE ISNUMERIC(f01) != 1
它什么也不返回所以我所有的值都应该是OBJ_TAB
中的数字我认为这是因为值存在于第一个表,而不是第二个(试图将null转换为bigInt)。这两张桌子可以这样连接吗?
我正在使用Microsoft SQL 2012
脚注:在OBJ_TAB中,存在数字前面的零数,这就是为什么将所有内容作为varchar进行比较不适合我的原因。
SELECT swmItems.upc
FROM swmItems
LEFT JOIN OBJ_TAB
ON CASE WHEN ISNUMERIC(OBJ_TAB.F01 + '.e0') = 1 -- ensure no decimals
THEN CASE WHEN CONVERT(float, OBJ_TAB.F01) BETWEEN -9223372036854775808
AND 9223372036854775807
THEN CONVERT(bigint, OBJ_TAB.F01)
END
END = swmItems.upc
WHERE OBJ_TAB.F01 IS NULL
不能将任何非数值转换为整数数据类型。但是您可以将数值转换为varchar数据类型。
那么,你可以这样尝试。
SELECT si.upc as upc from swmItems si
left outer join dbo.OBJ_TAB obj on obj.F01 = Cast(si.upc As Varchar)
WHERE obj.F01 IS NULL
很长的死胡同,但是如果你像我一样从未来遇到它,给TRY_CONVERT一个机会。