我有一个复杂的查询,其中我有一个varchar变量。我需要根据在该变量中接收到的数据的数据类型对它执行各种操作。
如果varchar变量包含数字值,那么我需要将其转换为数字数据类型,以便可以对其执行> <操作。
除了下面的部分之外,其他一切都很好
CONS_KEY | LABEL_ID | LINE_NO
----------------------------------
1084353 | 717EXP00001 | 1
1084353 | 717EXP00002 | 1
1084353 | 717EXP00003 | 1
1084353 | 717EXP00004 | 2
1084354 | 718EXP00001 | 1
1084354 | 718EXP00002 | 1
1084354 | 718EXP00003 | 2
1084354 | 718EXP00004 | 3
1084354 | 718EXP00005 | 3
上面的查询给了我错误“将数据类型varchar转换为数字时出错。”
我无法使用try_convert和类似的高级功能,因为我正在使用旧版本的SQL。
答案 0 :(得分:1)
CASE
语句尝试根据数据类型优先级将所有分支的数据类型合并为一个。在您的示例中,它试图将varchar文字'n'
转换为数字,因此将错误转换数据类型。完全删除ELSE
分支:
CASE WHEN ISNUMERIC(@testVal) = 1 THEN CAST(@testVal AS NUMERIC) END
一些例子:
SELECT val, CASE WHEN ISNUMERIC(val) = 1 THEN CAST(val AS NUMERIC) END AS to_num
FROM (VALUES
('1'),
(NULL),
('ok')
) AS v(val)
结果:
val | to_num
-----+-------
1 | 1
NULL | NULL
ok | NULL
您提到要使用<>
比较数字值。 NULL应该没有问题,它根本不会匹配。
答案 1 :(得分:0)
这似乎与sql_variant完美配合
select CASE WHEN IsNUMERIC(@testVal)=1 THEN Cast(@testVal as numeric) ELSE Cast(@testVal as sql_variant) End