我在表中有一个DataType为varchar(10)的字段。此字段包含格式化为varchar的数值,其唯一目的是用于将两个表连接在一起。一些样本数据将是:
AcctNum AcctNumChar
2223333 2223333
3324444 3324444
对于某些记录,该表有时会认为此字段(AcctNumChar)是数字,并且连接无法正常工作。然后,我必须使用Update语句将值重新输入为varchar。
有没有办法使用查询来确定字段中是否包含varchar或数值?我正在尝试缩小哪些记录有问题,而不必等待其中一个用户告诉我他们的查询没有返回任何命中。
答案 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
。