【问题标题】:Determine if a Varchar field has a Numeric entry确定 Varchar 字段是否具有数字条目
【发布时间】:2015-05-27 14:09:17
【问题描述】:

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

AcctNum        AcctNumChar   
2223333          2223333   
3324444          3324444

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

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

【问题讨论】:

  • 但是为什么你将 AcctNum 存储为字符,有时存储为数字?调整你的表定义,问题就会消失!
  • 它应该始终是 varchar,但由于某种原因,某些记录加载为数字。甚至不知道它是怎么发生的,但它确实发生了。
  • 该列始终为 varchar。但是,如果您将 varchar 字段连接到数字字段,则系统希望将 varchar 转换为数字。我认为这是问题所在。因此,请确保,当您将数字字段连接到此 varchar 字段时,然后将数字字段转换为 varchar。

标签: sql sql-server type-conversion


【解决方案1】:

您可以使用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)

那么你可以使用计算列而不是字符列。

【讨论】:

  • not like '%[0-9]%' 这不适用于abc123。仅当所有符号都是非数字时才有效。
  • @GiorgiNakeuri 。 . .谢谢你。那应该是(现在是)not like '%[^0-9]%'。双重否定。
【解决方案2】:

有几种方法可以检查varchar 列是否包含数值,但我向您推荐TRY_CONVERT 函数。

如果值不能转换为数字,它会给你NULL。例如,要获取所有具有数值的记录,您可以这样做:

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

【讨论】:

    【解决方案3】:

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

    参考这里 - https://msdn.microsoft.com/en-IN/library/ms187928.aspx

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        使用PATINDEX函数:

        DECLARE @s VARCHAR(20) = '123123'
        SELECT PATINDEX('%[^0-9]%', @s)
        

        如果@s 变量与0-9 范围不同,此函数将返回非数字符号第一次出现的索引。如果所有符号都是数字,它将返回0

        【讨论】:

          猜你喜欢
          • 2011-05-18
          • 2015-11-11
          • 2015-04-30
          • 2012-12-09
          • 2013-08-28
          • 1970-01-01
          • 2018-08-11
          • 2014-04-26
          • 1970-01-01
          相关资源
          最近更新 更多