我有一个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?
答案 0 :(得分:3)
INT
和NUMERIC
不一样。 ISNUMERIC
正在返回可能可能是数字类型(INT, BIGINT, DECIMAL, FLOAT, MONEY)
的任何内容。
示例:SELECT ISNUMERIC('$')
这不是INT
但返回true,因为它的格式正确为MONEY
。 ISNUMERIC
也适用于科学记数法...... 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功能。