我想知道如何在SQL中使用IsNumeric,它与VBScript略有不同,但我认为我能够绕过它,即:
IF 1 = ISNUMERIC('5675754674')
BEGIN
...
END
这会是一种解决方法吗?我真正想做的是:
IF ISNUMERIC('5675754674')
BEGIN
...
END
但这会产生错误。示例1似乎有效,但只是确保我做得对,无法在网上找到任何好的资源。
答案 0 :(得分:15)
SQL Server中没有boolean
。这意味着你不能只说IF (expression)
;你必须将它与某些东西进行比较,因为它确实会返回true
或false
,就像你在其他语言中习惯的那样。
只是偏好,但我更愿意这样写:
IF ISNUMERIC('5675754674') = 1
BEGIN
...
END
在SQL Server中没有办法避免与第一个示例中的1进行比较。
另外,您应该注意ISNUMERIC()
的弱点 - 它可以为“{1}},.
,CHAR(9)
等”数字“值提供误报。 ,e
和许多其他非数字字符串。例如,如果你想知道某些东西是否为整数,最好说:
$
但即使这不是一个完整而有效的测试,因为它将为值IF '5675754674' NOT LIKE '%[^0-9]%'
BEGIN
...
END
返回true,并且对于负值将返回false。
> (2^32)-1
的另一个缺点是,如果值可以转换为任何的数值类型,它将返回true,这与 all 数字类型。通常人们会测试ISNUMERIC()
,然后尝试将ISNUMERIC()
投射到FLOAT
,转换失败。
在SQL Server 2012中,您将有一个名为TRY_CONVERT()
的新方法,如果转换为指定的数据类型无效,则返回SMALLINT
。
答案 1 :(得分:5)
你是对的,ISNUMERIC()返回一个int。 您可以查看文档:{{3}}
答案 2 :(得分:2)
SQL中的IF
语句需要IF
之后的布尔表达式 - 请参阅the MSDN reference here.
在不使用CAST()
或CONVERT()
之类的内容的情况下,SQL不是最好的处理类型之间的转换,这意味着int
值ISUNUMERIC()
返回只会被解析当你使用一些比较器(=,<,>等)产生一个真/假结果时,作为一个布尔值。
IF ISNUMERIC('5675754674') = 1
可能是在TSQL中编写此代码的最佳方式 - 它清楚地描述了'如果此值通过此函数运行返回1(可以作为数值数据类型计算)的意图,那么执行此操作事情。'
考虑到这一点,您应该知道ISNUMERIC
仅检查您传入的值将评估为-any-可用的数值数据类型。如果您正在运行的数据包含科学记数法或其他不正常现象,这可能会导致麻烦;有关详细信息,请参阅here。