【发布时间】:2019-06-28 07:03:51
【问题描述】:
IsNumeric 允许以下特殊字符
`SELECT ISNUMERIC('10.50') as '10.50'
ISNUMERIC('10,50') as '10,50'
,ISNUMERIC('-') as '-'
,ISNUMERIC('+') as '+'
,ISNUMERIC('$') as '$'
,ISNUMERIC('.') as '.'
,ISNUMERIC(',') as ','
,ISNUMERIC('\') as '\'`
所以,我想使用 RegEx https://regexr.com/4gjhm 来验证我的数字,它必须只允许数字和点。
在PATINDEX的帮助下尝试了Regex ^[0-9]+[.]{0,1}[0-9]*$,但没有得到预期的结果
`DECLARE @Amount As NVARCHAR(50) = '150';
SELECT CASE
WHEN @Amount LIKE '%^[0-9]+[.]{0,1}[0-9]*$%'
THEN 1
ELSE 0
END AS IsNumericResult`
有效示例:10、10.01、.20 无效的示例:10.50.20、10..20 等
这是否可以通过 SQL Server 2017 中的LIKE 或PATINDEX 来实现?
【问题讨论】:
-
%^ ...$%对我来说似乎有点矛盾。 -
ISNUMERIC()不会像您已经声明的那样帮助您,而是可以使用TRY_CAST() / TRY_CONVERT()。无需正则表达式。 -
删除怎么样。和数字,然后查看 inf 字符串中是否还有任何内容...
-
这里的最终目标是什么?你为什么要验证字符串是那种模式?是否检测它是否会在没有错误或其他原因的情况下转换为
numeric? -
问题是,SQL Server 不支持正则表达式。虽然您可以匹配具有范围
[0-9]或设置[01234]的单个字符,但您不能使用+或*来匹配它们的直觉计数。即类似[0-9]+将匹配1+但不匹配123。因此,您可能最好使用@Sami 答案并添加一些额外的测试以排除例如+123或-1.5
标签: sql sql-server regex tsql isnumeric