我有一个select语句,在select语句中我有几列我在其上执行基本计算(例如[Col1] * 3.14)。但是,偶尔我遇到非数字值,当发生这种情况时,整个存储过程因一行而失败。
我已经考虑过使用WHERE ISNUMERIC(Col1) <> 0
,但我会排除其他列中的信息。
在TSQL中是否有办法以某种方式用NULL或0 ??
替换所有stings答案 0 :(得分:3)
像...一样的东西。
SELECT blah1, blah2, blah3
CASE WHEN ISNUMERIC(Col1) = 1 THEN [Col1] * 3.14 ELSE NULL END as whatever
FROM your_table
也可以做个案......
答案 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
有趣的是,最后仍然失败