SQL服务器:如何测试字符串是否只有数字字符
SQL Server : How to test if a string has only digit characters
我在 SQL Server 2008 中工作。我正在尝试测试一个字符串 (varchar) 是否只有数字字符 (0-9)。我知道 IS_NUMERIC 函数会给出虚假的结果。 (我的数据可能有 $ 符号,这不应该通过测试。)所以,我正在避免该功能。
我已经测试过字符串是否包含任何非数字字符,即
some_column LIKE '%[^0123456789]%'
我认为唯一数字测试会是类似的东西,但我画了一个空白。有什么想法吗?
SQL 2008 及更高版本有一个名为 ISNUMERIC 的系统函数。一个例子:
SELECT myCol
FROM mTable
WHERE ISNUMERIC(myCol)<> 1;
我做了几个快速测试,还进一步查看了文档:
ISNUMERIC returns 1 when the input expression evaluates to a valid numeric data type; otherwise it returns 0.
这意味着它是相当可预测的,例如
-9879210433
会通过,但 987921-0433
不会。
79210433
会通过,但 98792103
不会。
因此,使用此信息,您可以根据 list of valid currency symbols 和 +
& -
字符进行筛选。
使用Not Like
where some_column NOT LIKE '%[^0-9]%'
演示
declare @str varchar(50)='50'--'asdarew345'
select 1 where @str NOT LIKE '%[^0-9]%'
DECLARE @x int=1
declare @exit bit=1
WHILE @x<=len('123c') AND @exit=1
BEGIN
IF ascii(SUBSTRING('123c',@x,1)) BETWEEN 48 AND 57
BEGIN
set @x=@x+1
END
ELSE
BEGIN
SET @exit=0
PRINT 'string is not all numeric -:('
END
END
解决方法:
where some_column NOT LIKE '%[^0-9]%'
是正确的。
只有一个重要说明:在字符串列 = ''
(空字符串)时添加验证。这种情况下 return ''
也是一个有效数字。
我试图找到只有数字的字符串,没有标点符号或其他任何东西。我终于找到了可行的答案 here.
使用 PATINDEX('%[^0-9]%', some_column) = 0 允许我过滤除实际数字字符串之外的所有内容。
所选答案无效。
declare @str varchar(50)='79D136'
select 1 where @str NOT LIKE '%[^0-9]%'
我没有解决方案,但知道这个潜在的陷阱。如果将字母 'D' 替换为科学记数法 'E',也是如此。
可行的方法。上面的使用方法不行。
declare @str varchar(50)='79136'
select
case
when @str LIKE replicate('[0-9]',LEN(@str)) then 1
else 0
end
declare @str2 varchar(50)='79D136'
select
case
when @str2 LIKE replicate('[0-9]',LEN(@str)) then 1
else 0
end
我在 SQL Server 2008 中工作。我正在尝试测试一个字符串 (varchar) 是否只有数字字符 (0-9)。我知道 IS_NUMERIC 函数会给出虚假的结果。 (我的数据可能有 $ 符号,这不应该通过测试。)所以,我正在避免该功能。
我已经测试过字符串是否包含任何非数字字符,即
some_column LIKE '%[^0123456789]%'
我认为唯一数字测试会是类似的东西,但我画了一个空白。有什么想法吗?
SQL 2008 及更高版本有一个名为 ISNUMERIC 的系统函数。一个例子:
SELECT myCol
FROM mTable
WHERE ISNUMERIC(myCol)<> 1;
我做了几个快速测试,还进一步查看了文档:
ISNUMERIC returns 1 when the input expression evaluates to a valid numeric data type; otherwise it returns 0.
这意味着它是相当可预测的,例如
-9879210433
会通过,但 987921-0433
不会。
79210433
会通过,但 98792103
不会。
因此,使用此信息,您可以根据 list of valid currency symbols 和 +
& -
字符进行筛选。
使用Not Like
where some_column NOT LIKE '%[^0-9]%'
演示
declare @str varchar(50)='50'--'asdarew345'
select 1 where @str NOT LIKE '%[^0-9]%'
DECLARE @x int=1
declare @exit bit=1
WHILE @x<=len('123c') AND @exit=1
BEGIN
IF ascii(SUBSTRING('123c',@x,1)) BETWEEN 48 AND 57
BEGIN
set @x=@x+1
END
ELSE
BEGIN
SET @exit=0
PRINT 'string is not all numeric -:('
END
END
解决方法:
where some_column NOT LIKE '%[^0-9]%'
是正确的。
只有一个重要说明:在字符串列 = ''
(空字符串)时添加验证。这种情况下 return ''
也是一个有效数字。
我试图找到只有数字的字符串,没有标点符号或其他任何东西。我终于找到了可行的答案 here.
使用 PATINDEX('%[^0-9]%', some_column) = 0 允许我过滤除实际数字字符串之外的所有内容。
所选答案无效。
declare @str varchar(50)='79D136'
select 1 where @str NOT LIKE '%[^0-9]%'
我没有解决方案,但知道这个潜在的陷阱。如果将字母 'D' 替换为科学记数法 'E',也是如此。
可行的方法。上面的使用方法不行。
declare @str varchar(50)='79136'
select
case
when @str LIKE replicate('[0-9]',LEN(@str)) then 1
else 0
end
declare @str2 varchar(50)='79D136'
select
case
when @str2 LIKE replicate('[0-9]',LEN(@str)) then 1
else 0
end