如何在 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 中的LIKEPATINDEX 来实现?

【问题讨论】:

%^ ...$% 对我来说似乎有点矛盾。 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 中使用正则表达式检查字符串是不是为数字?的主要内容,如果未能解决你的问题,请参考以下文章

sql server中对字段使用正则表达式替换???

PL/SQL 正则表达式检查

带正则表达式的参数化 SQL、ORACLE 与 SQL Server

SQL正则表达式检查JSON数组中是否存在至少一个项目

SQL Server:选择列中多次出现正则表达式匹配的行

用于在 SQL Server 中验证表名的正则表达式(数据库兼容级别 120)[关闭]