如何在CASE When语句中检查varchar变量是否为数值

时间:2018-10-17 08:00:47

标签: sql sql-server sql-server-2008

我有一个复杂的查询,其中我有一个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。

2 个答案:

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