TSQL - 替换isnumeric = 0

时间:2018-03-16 13:43:20

标签: tsql sql-server-2016 isnumeric

我有一个select语句,在select语句中我有几列我在其上执行基本计算(例如[Col1] * 3.14)。但是,偶尔我遇到非数字值,当发生这种情况时,整个存储过程因一行而失败。

我已经考虑过使用WHERE ISNUMERIC(Col1) <> 0,但我会排除其他列中的信息。

在TSQL中是否有办法以某种方式用NULL或0 ??

替换所有stings

4 个答案:

答案 0 :(得分:3)

像...一样的东西。

SELECT blah1, blah2, blah3
   CASE WHEN ISNUMERIC(Col1) = 1 THEN [Col1] * 3.14 ELSE NULL END as whatever
FROM your_table

也可以做个案......

  • 非数字值应该转换为数字或NULL,如果它符合列中的预期,
  • 如果需要数字,那么该列应首先是数字数据类型而不是字符数据类型,这允许这些类型的错误。

答案 1 :(得分:0)

ISNUMERIC是一种可怕的方法,因为有太多的东西被识别为NUMERIC,而这些东西无法与非MONEY数据类型相乘。

https://www.brentozar.com/archive/2018/02/fifteen-things-hate-isnumeric/

这很失败,因为&#39; - &#39;是一个数字......

DECLARE @example TABLE (numerics VARCHAR(10));

INSERT INTO @example VALUES ('-')

SELECT CASE WHEN ISNUMERIC(numerics) = 1 THEN numerics  * 3.14 ELSE NULL END  
FROM @example;

尝试使用TRY_CAST(尽管修改您的DECIMAL精度以满足您的需求):

DECLARE @example TABLE (numerics VARCHAR(10));

INSERT INTO @example VALUES ('-')

SELECT TRY_CAST(numerics AS decimal(10,2)) * 3.14  FROM @example;

答案 2 :(得分:0)

我更喜欢Try_Cast:

SELECT
    someValue
    ,TRY_CAST(someValue as int) * 3.14     AS TRY_CAST_to_int
    ,TRY_CAST(someValue as decimal) * 3.14 AS TRY_CAST_to_decimal
    ,IIF(ISNUMERIC(someValue) = 1, someValue, null) * 3.14 as IIF_IS_NUMERIC
FROM (values 
    ( 'asdf'), 
    ( '2' ),
    ( '1.55')
) s(someValue)

答案 3 :(得分:0)

trycast将测试特定类型

declare @T table (num varchar(20));
insert into @T values ('12'), ('3.14'), ('5.6E12'), ('$120'), ('-'), (''), ('cc'), ('aa'), ('bb'), ('1/5'); 
select t.num, ISNUMERIC(t.num) as isnumeric
     , isnull(TRY_CONVERT(smallmoney, t.num), 0) as smallmoney 
     , TRY_CONVERT(float, t.num) as float
     , TRY_CONVERT(decimal(18,4), t.num) as decimal 
     , isnull(TRY_CONVERT(smallmoney, t.num), TRY_CONVERT(float, t.num)) as mix
from @T t

num                  isnumeric   smallmoney            float                  decimal
-------------------- ----------- --------------------- ---------------------- ---------------------------------------
12                   1           12.00                 12                     12.0000
3.14                 1           3.14                  3.14                   3.1400
5.6E12               1           0.00                  5600000000000          NULL
$120                 1           120.00                NULL                   NULL
-                    1           0.00                  NULL                   NULL
                     0           0.00                  0                      NULL
cc                   0           0.00                  NULL                   NULL
aa                   0           0.00                  NULL                   NULL
bb                   0           0.00                  NULL                   NULL
1/5                  0           0.00                  NULL                   NULL

有趣的是,最后仍然失败