检查一个字符串是否仅包含数字

17

我正在尝试检查一个字符串是否只包含以下格式的有效数字

123.456
123
.356

但它应该拒绝任何包含非数字的内容,包括双点号。这里是一些无效格式。

d123.456
123d
12d3
d.1256
12d.456
12.d12
12.d45d
12.45.56
我已经完成了以下操作。
SELECT CASE WHEN '123.00' NOT LIKE '%[^0-9.]%' THEN 'Valid' ELSE 'Invalid' END

除了字符串中有多个点的情况外,似乎都可以正常工作。

我该如何调整正则表达式,以仅允许一个点,否则返回“无效”?

When seems to work except for the case where there is more than one dot in the string.

How can I tweak the regular expression to only allow one dot otherwise return 'Invalid'?


2
这些不是正则表达式。 - paparazzo
5个回答

22

我建议使用try_convert()

select (case when try_convert(col, float) is not null then 'valid' else 'invalid' end)

唯一可能的缺点是指数格式;例如,1e6 是一个有效的数字。

另一种选择是采用 where 方法;你只需要更完整的逻辑:

select (case when col like '%[^0-9.]%' then 'invalid'
             when col like '%.%.%' then 'invalid'
             else 'valid'
        end)

谢谢,那很有道理! - Junior

5

有一个内置的SQL Server函数:

Select CASE WHEN isnumeric([fieldname]) THEN 'Valid' ELSE 'Invalid" END

选择 isnumeric('123.00') 返回 true。 - Matt
1
@MikeA 那绝对是错误的。IsNumeric不检查数据类型。那有什么意义呢?这个怎么样?选择ISNUMERIC('1')。 - Sean Lange
1
IsNumeric 不是这里的答案。在这种情况下,它返回了太多错误的结果。 - Sean Lange
这是来自文档的定义:“当输入表达式评估为有效的数值数据类型时,ISNUMERIC返回1;否则返回0。有效的数值数据类型包括以下内容:” https://msdn.microsoft.com/zh-cn/library/ms186272.aspx - Junior
2
当输入表达式评估为数值数据类型时,@MikeA。这意味着它可以转换为数值数据类型。这与输入的数据类型无关。 - Sean Lange
显示剩余3条评论

3
如果您不使用正则表达式,SQL Server有一个ISNUMERIC函数可用于此操作。

当输入表达式评估为有效的数值数据类型时,ISNUMERIC返回1;否则返回0。


1
ISNUMERIC检查数据类型而不是数值,因此任何字符串都将返回false。 - Junior
他们的示例似乎有争议:SELECT name, **isnumeric(name) AS IsNameANumber**, database_id, isnumeric(database_id) AS IsIdANumber FROM sys.databases; - Adam V
2
ISNUMERIC是一个名字很糟糕的函数。它应该被命名为类似于ValueIsSomethingThatCanBeConvertedToAnyDatatypeThatIsRoughlyANumber的东西。例如,1e3将返回true。 - Sean Lange
3
@MikeA那绝对是错误的。IsNumeric并不检查数据类型。那样做有什么意义呢?试试这个怎么样?选择ISNUMERIC('1')。 - Sean Lange
1
我同意它对表达式进行评估,但它还接受+-、货币符号以及e作为指数。 - paparazzo

3

TRY_PARSE将允许您将输入值与您决定允许的任何/所有数字数据类型进行比较--例如:

SELECT 
   TRY_PARSE('123.456' as int) as [int],
   TRY_PARSE('123.0' as float) as [float],
   TRY_PARSE('d123.456' as int) as [int],
   TRY_PARSE('d123.456' as float) as [float]

对于技术人员来说,ISNUMERIC 看起来是最佳函数名,但事实上并不符合大多数人的期望,因为它可以允许包括数学符号和货币符号在内的其他字符。


这是我的输出: Msg 195,级别 15,状态 10,行 14 “TRY_PARSE”不是已知的内置函数名称。 - Junior
SQL Server 2012 +(抱歉我没有澄清) - Chains

0

NOT LIKE语句的另一种解决方案是:

where REGEXP_LIKE(column, '^[[:digit:]]+$')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接