T-Sql ISNUMERIC('45D-1')返回1

时间:2016-11-30 21:26:26

标签: sql sql-server tsql isnumeric

我有一个T-Sql语句,它从表中获取下一个可用的数字。 但该列的类型为nvarchar。 它必须是一个数字,但我仍然需要能够得到下一个可用的数字

因此,当我运行sql时,我尝试只获取数字

WHERE
ISNUMERIC(myCol) AND CAST(REPLACE(myCol, N'0', N'') AS int)

但我收到错误

Conversion failed when converting the nvarchar value '45D-1' to data type int.

所以我只跑

select ISNUMERIC('45D-1')

令我惊讶的是它的真实

我已经为“。”写了一个替代品。这有道理,但为什么“D”是一个数字?为什么不能sql施放它?是否有一个功能来真正测试它是否是一个Int?

5 个答案:

答案 0 :(得分:3)

INTNUMERIC不一样。 ISNUMERIC正在返回可能可能是数字类型(INT, BIGINT, DECIMAL, FLOAT, MONEY)的任何内容。

示例:SELECT ISNUMERIC('$')

这不是INT但返回true,因为它的格式正确为MONEYISNUMERIC也适用于科学记数法...... SELECT ISNUMERIC('1e4')会导致真实。我所提出的观点是,在不了解评估内容或所有可能性的情况下,不要相信ISNUMERIC

答案 1 :(得分:1)

如果2012+你可以使用Try_Convert()

select Try_Convert(int,'45D-1')

返回

NULL

答案 2 :(得分:1)

select ISNUMERIC('45D-1' + '.e0')

为我工作,并帮助我了解"。"问题

答案 3 :(得分:1)

你偶然发现一个有效的符号(我也不知道):

SELECT CAST('45D-1' AS FLOAT) --4.5
SELECT CAST('45D-2' AS FLOAT) --0.45
SELECT CAST('45D-3' AS FLOAT) --0.045
SELECT CAST('45D+1' AS FLOAT) --450
SELECT CAST('45D+3' AS FLOAT) --45000

产生与

相同的结果
SELECT CAST('45e-1' AS FLOAT)
SELECT CAST('45e-2' AS FLOAT)
SELECT CAST('45e-3' AS FLOAT)
SELECT CAST('45e+1' AS FLOAT)
SELECT CAST('45e+3' AS FLOAT)

显然,使用字母d的科学记数法与更常见的e相同。

只需将.0添加到您的字符串中,ISNUMERIC将返回无号码

DECLARE @s VARCHAR(100)='45D-1';
SELECT ISNUMERIC(@s+'.0')

(仅限工作,如果您的数字还没有小数位数......)

更新

您可以使用PATINDEX来搜索任何不是0-9的字符:

DECLARE @s VARCHAR(100)='45D-1';
SELECT CASE WHEN PATINDEX('%[^0-9]%',@s)>0 THEN 'Nope!' ELSE 'Yeah!' END AS IsInt 

答案 4 :(得分:0)

T-SQL与其他语言的工作方式不同。评估取决于查询计划。它可以按照它认为最有效的任何顺序自由评估它们。

使用衍生的qry,如:

select * 
from (
    select * 
    from tbl
    where isnumeric(myCol) = 1
    -- where yourfunction(myCol) = 1 -- where your function returns null on non-numeric
) t
where myCol = 8

在你的功能中,你必须删除。#$ A-Z,+ -...但在某些情况下,你需要用D或E表示科学家符号。最快的是用于此目的的CRL功能。