将varchar转换为bigInt,包括空值

时间:2014-06-21 00:57:49

标签: sql sql-server

我试图获取一个表中存在的所有值而不是另一个表中存在的所有值。加入它们的条件是一个表中的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对我不起作用的原因。

2 个答案:

答案 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