ISNUMERIC() 不适用于小数

Posted

技术标签:

【中文标题】ISNUMERIC() 不适用于小数【英文标题】:ISNUMERIC() does not work for decimals 【发布时间】:2017-02-03 14:59:10 【问题描述】:

我正在使用 SQL Server 2008 R2 函数 ISNUMERIC() 来确定字符串是否为小数。 当小数点为逗号或逗号和句点时,它返回“1”。我可以解决这些问题,但此查询是 s-s-rS 报告的一部分,将分发给许多用户,我无法纠正所有问题。

我可以使用什么来代替 ISNUMERIC() 来确定字符串是否是正确格式的小数?我不能使用 TRY_PARSE(),因为它在 SQL SERVER 2012 中可用,而我在 2008 R2 上。

更新 我想用 PATINDEX() 替换 ISNUMERIC() 来识别小数。 这两个例子都返回 0

SELECT PATINDEX('9,0', '%[0-9]%.%[0-9]%')
SELECT PATINDEX('9.0', '%[0-9]%.%[0-9]%')

我做错了什么?

【问题讨论】:

你的目标是什么?为什么不想使用 ISNUMERIC()? 它不起作用。最初,我使用的是 ISNUMERIC()。对于字符串值 '9,.7',此函数返回 'true' 在进行一些搜索后,有人指出不应使用此函数。如果您使用的是 SQL 2012,则可以使用 TRY_PARSE() 但我使用的是 SQL 2008。 要获得明确的匹配功能,我认为除了使用正则表达式之外别无他法。此功能不作为 SQL Sever 2008 的标准选项提供。但是,可以添加它。我认为这是中级到高级技术。如果您能够弄清楚这一点,您的 SQL Server 管理员/DBA 可能会说“不可能!”以下是一些链接,其中包含相同解决方案的各种方法,SQL Server 2008 中的正则表达式支持。simple-talk.com/sql/t-sql-programming/… 另一种方法。 codeproject.com/articles/42764/… 还有一个。这是我必须为我工作的一个。 blogs.sap.com/2013/01/31/… 【参考方案1】:

您的 PATINDEX 参数值是相反的。这应该适合你...

SELECT PATINDEX('%[0-9]%,%[0-9]%', '9,0')
SELECT PATINDEX('%[0-9]%.%[0-9]%', '9.0')

诺埃尔

【讨论】:

呃!谢谢!但是,如果我也想包含整数,我是否只需在查询中添加 OR 还是有办法更改模式? 您需要添加一个 OR @GloriaSantin 我认为您将不得不在 CASE 语句中使用 OR。像这样... SELECT CASE WHEN PATINDEX('%[0-9]%.%[0-9]%', '9.0') = 1 OR PATINDEX('%[0-9]%', '9 ') = 1 THEN 1 ELSE 0 END 谢谢。我会尝试这样做,因为将 or 放在 where 子句中不起作用。 当字符串value 试图转换为数字时,它仍然会抛出错误,而实际上它不是。因此,该值在不是数字时通过PATINDEX 函数。

以上是关于ISNUMERIC() 不适用于小数的主要内容,如果未能解决你的问题,请参考以下文章

isNumeric 未测试所有表单字段

SQL 检查 Varchar 是否能转换为 NUMERIC

Python isnumeric()方法

Python3 isnumeric()方法

NSNumberFormatter 适用于小数分隔符但不适用于逗号分隔符

更新烧瓶中的 SQL 查询不适用于浮点/小数点