如何在 SQL Server 中使用正则表达式检查字符串是不是为数字?
Posted
技术标签:
【中文标题】如何在 SQL Server 中使用正则表达式检查字符串是不是为数字?【英文标题】:How to check a string is numeric using Regex in SQL Server?如何在 SQL Server 中使用正则表达式检查字符串是否为数字? 【发布时间】: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
【参考方案1】:
您可以使用 TRY_CAST()
或 TRY_CONVERT()
而无需正则表达式
SELECT CASE WHEN TRY_CAST(@Amount AS INT) IS NULL THEN 0 ELSE 1 END IsNumericResult
您可以根据需要将那里的INT
更改为数字或小数。
例如:
SELECT V Value,
CASE WHEN TRY_CAST(V AS DECIMAL(10,2)) IS NULL
THEN 0
ELSE 1
END IsNumericResult
FROM
(VALUES ('10.50'), ('+'), ('$'), ('-'), ('11')) T(V);
这里是db<>fiddle,看看它是如何工作的。
【讨论】:
这也将允许+10.5
和 -11
根据 op original question 无效。
试试 ` ('+0'), ('$0'), ('-0') ` 与ISNUMERIC
的唯一区别是('$0')
@derpirscher 1st OP 没有在他的 Q 中说明,2nd -11
不是数字???你是从哪里想到的?没有负数/正数?
对于他们给出的具体示例字符串,这具有预期的效果。 rextester.com/VJX9909
@Sami 从操作问题中引用:“验证我的数字,它必须只允许数字和点”是的 -11
是一个数字,但 OP 不想允许它,至少据我所知他的问题(以及不包含负号的初始正则表达式)以上是关于如何在 SQL Server 中使用正则表达式检查字符串是不是为数字?的主要内容,如果未能解决你的问题,请参考以下文章