INTEGER - 替换 isnumeric = 0

TSQL - replace isnumeric = 0

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

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

TSQL 中有没有办法以某种方式将所有字符串替换为 NULL 或 0??

类似...

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

也可以这样写..

  • non-numeric 值应转换为数字或 NULL(如果这是列中的预期值),
  • 如果需要数字,则该列首先应该是数字数据类型,而不是字符数据类型,这允许出现这些类型的错误。

ISNUMERIC 是一种糟糕的方法,因为有太多的东西被标识为 NUMERIC,它们无法与非 MONEY 数据相乘类型。

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

这惨遭失败,因为“-”是一个数字...

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;

我更喜欢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)

trycast 将测试特定类型

declare @T table (num varchar(20));
insert into @T values ('12'), ('3.14'), ('5.6E12'), ('0'), ('-'), (''), ('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
0                 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

有趣最后还是失败了