确定Varchar字段是否具有数字条目

时间:2015-05-27 14:09:18

标签: sql sql-server type-conversion

我在表中有一个DataType为varchar(10)的字段。此字段包含格式化为varchar的数值,其唯一目的是用于将两个表连接在一起。一些样本数据将是:

AcctNum        AcctNumChar   
2223333          2223333   
3324444          3324444

对于某些记录,该表有时会认为此字段(AcctNumChar)是数字,并且连接无法正常工作。然后,我必须使用Update语句将值重新输入为varchar。

有没有办法使用查询来确定字段中是否包含varchar或数值?我正在尝试缩小哪些记录有问题,而不必等待其中一个用户告诉我他们的查询没有返回任何命中。

5 个答案:

答案 0 :(得分:2)

您可以使用isnumeric()进行通用比较,例如:

select (case when isnumeric(acctnum) = 1 then cast(acctnum as decimal(10, 0))
        end)

但是,在你的情况下,你似乎只想要整数:

(case when acctnum not like '%[^0-9]%' then cast(acctnum as decimal(10, 0)) 
 end)

但是,我强烈建议您更新表以将数据类型更改为数字,这似乎是值的正确类型。您还可以将计算列添加为:

alter table t add AcctNum_Number as 
    (case when acctnum not like '%[^0-9]%' then cast(acctnum as decimal(10, 0)) 
     end)

然后您可以使用计算列而不是字符列。

答案 1 :(得分:0)

有几种方法可以检查varchar列是否包含数值,但我建议您使用TRY_CONVERT功能。

如果值无法转换为数字,它将为您提供NULL。例如,要获取具有数值的所有记录,可以执行以下操作:

SELECT *
FROM [table]
WHERE TRY_CONVERT(INT, [value]) IS NOT NULL

答案 2 :(得分:0)

您可以在此处使用CAST和CONVERT(Transact-SQL)函数来解决您的目的。

此处参考 - https://msdn.microsoft.com/en-IN/library/ms187928.aspx

答案 3 :(得分:0)

IsNumeric工作,TRY_CONVERT没有(由于某种原因,SQL不会将其识别为内置函数)。无论如何,为了记录,我运行了以下查询并获得了所有可疑记录:

SELECT *
FROM ACCT_LIST
where IsNumeric([ACCT_NUM_CHAR]) = 0

答案 4 :(得分:0)

使用char** a; int main() { int n; do { cout << "N= "; cin >> n; } while(n < 1); a = new char*[n]; for(int i = 0; i < n; ++i) { a[i] = new char[20]; } for(int i = 0; i < n; ++i) { memset(a[i], 0, 20); } return 0; } 功能:

PATINDEX

如果DECLARE @s VARCHAR(20) = '123123' SELECT PATINDEX('%[^0-9]%', @s) 变量与范围@s不同,则此函数将返回非数字符号首次出现的索引。如果所有符号都是数字,则返回0-9