我试图获取一个表中存在的所有值而不是另一个表中存在的所有值。加入它们的条件是一个表中的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对我不起作用的原因。
答案 0 :(得分:2)
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
答案 1 :(得分:0)
您无法将任何非数字值转换为整数数据类型。但您可以将数值转换为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