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
有趣最后还是失败了
我有一个 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
有趣最后还是失败了