TryParse
)。不幸的是,ISNUMERIC
不适合我,因为我只想解析整数而不是每一种数字。是否有像 ISINT
这样的东西存在?下面是一些代码,以便说明清楚。如果
MY_FIELD
不是整数,那么这段代码将会失败:SELECT @MY_VAR = CAST(MY_FIELD AS INT)
FROM MY_TABLE
WHERE MY_OTHER_FIELD = 'MY_FILTER'
谢谢
TryParse
)。不幸的是,ISNUMERIC
不适合我,因为我只想解析整数而不是每一种数字。是否有像 ISINT
这样的东西存在?MY_FIELD
不是整数,那么这段代码将会失败:SELECT @MY_VAR = CAST(MY_FIELD AS INT)
FROM MY_TABLE
WHERE MY_OTHER_FIELD = 'MY_FILTER'
谢谢
这里有一篇博客文章,描述了如何创建一个IsInteger
UDF。
基本上,它建议在值后面添加'.e0'
并使用IsNumeric
。这样,任何已经有小数点的东西现在就有了两个小数点,导致IsNumeric
为false,任何已经以科学计数法表示的东西也会被e0
无效化。
SELECT ISNUMERIC (CHAR(11) + '.e0')
返回 0
,因此通过了测试,而不是失败。 - Reversed EngineerSELECT keycol, string, ISNUMERIC(string) AS is_numeric,
CASE
WHEN ISNUMERIC(string) = 0 THEN 0
WHEN string LIKE '%[^-+ 0-9]%' THEN 0
WHEN CAST(string AS NUMERIC(38, 0))
NOT BETWEEN -2147483648. AND 2147483647. THEN 0
ELSE 1
END AS is_int
FROM dbo.T1;
CLR解决方案中的T-SQL部分更简单。您调用fn_IsInt函数的方式与调用ISNUMERIC相同。
SELECT keycol, string, ISNUMERIC(string) AS is_numeric,
dbo.fn_IsInt(string) AS is_int
FROM dbo.T1;
C#部分只是.NET解析函数Int32.TryParse的包装器。这是因为SQL Server int和.NET Int32都是32位有符号整数。
using System;
using System.Data.SqlTypes;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlBoolean fn_IsInt(SqlString s)
{
if (s.IsNull)
return SqlBoolean.False;
else
{
Int32 i = 0;
return Int32.TryParse(s.Value, out i);
}
}
};
请阅读Itzik的文章,以获取这些代码示例的完整解释。ISNUMERIC(',')
返回1(真),但在我看来是假的! - MarcWHERE IsNumeric(MY_FIELD) = 1 AND CAST(MY_FIELD as VARCHAR(5)) NOT LIKE '%.%'
这可能是最简单的解决方案。除非您的MY_FIELD
包含 .00 或类似的内容。如果是这种情况,请将其转换为浮点数以删除任何尾随的 .00。
召唤亡灵。
从SQL-Server 2012开始,您可以使用TRY_CAST。如果转换不成功,则返回NULL。
示例:
DECLARE @foo varchar(200)
SET @foo = '0123'
-- SET @foo = '-0123'
-- SET @foo = '+0123'
-- SET @foo = '+-0123'
-- SET @foo = '+-0123'
-- SET @foo = '.123'
-- SET @foo = '1.23'
-- SET @foo = '.'
-- SET @foo = '..'
-- SET @foo = '0123e10'
SELECT CASE WHEN TRY_CAST(@foo AS integer) IS NULL AND @foo IS NOT NULL THEN 0 ELSE 1 END AS isInteger
这是唯一真正可靠的方法。
如果您需要支持SQL-Server 2008,则回退到Sam DeHaan的回答:
SELECT CASE WHEN ISNUMERIC(@foo + '.e0') = 1 THEN 1 ELSE 0 END AS isInteger
SQL-Server 2012之前(又称2008R2)的支持将于2019年7月9日结束。此时很快,可能会停止对2012之前版本的支持。
在此时,我不再使用任何其他技巧。只需告诉您节俭的客户更新 - 自2008年以来已经过去了10多年。
SELECT @MY_VAR = CASE WHEN TRY_CONVERT(INT,MY_FIELD) IS NOT NULL THEN MY_FIELD
ELSE 0
END
FROM MY_TABLE
WHERE MY_OTHER_FIELD = 'MY_FILTER'
WHERE
子句的正确用法;如果要将函数包装起来,请使用CASE WHEN
。 ISNUMERIC(table.field) > 0 AND PATINDEX('%[^0123456789]%', table.field) = 0
SELECT *
FROM MY_TABLE
WHERE CHARINDEX('.',MY_FIELD) = 0 AND CHARINDEX(',',MY_FIELD) = 0
AND ISNUMERIC(MY_FIELD) = 1 AND CONVERT(FLOAT,MY_FIELD) / 2147483647 <= 1
以下是与 IsNumeric 函数相关的解决方案:
select * from A where ISNUMERIC(x) =1 and X not like '%.%'
或者使用:
select * from A where x **not like** '%[^0-9]%'
声明 @i numeric(28,5) = 12.0001
如果 (@i/cast(@i as int) > 1) 开始 选择 '这不是整数' 结束 否则 开始 选择 '这是整数' 结束
TRY_CONVERT
函数。 - Nick.McDermaid