【问题标题】:Converting numeric values in varchar to decimal将 varchar 中的数值转换为十进制
【发布时间】:2019-07-20 02:48:06
【问题描述】:

将数值从 varchar 数据类型转换为十进制时出错

select 
    case PCI1__c 
       when ISNUMERIC(rtrim(ltrim(PCI1__c))) 
          then convert(decimal(10, 2), PCI1__c)
          else null 
    end as PCI1__c 
from 
    MX_CREDIT_ANALYSIS;

仅供参考,该列包含“无收入”、“二”、“收入 22”、“5.5”等值

得到错误:

将 varchar 值“5.5”转换为数据类型 int 时转换失败。

【问题讨论】:

  • 请提及您的 SQL Server 版本

标签: sql sql-server casting type-conversion varchar


【解决方案1】:

isnumeric() 返回一个integer,因此当您执行CASE pci1__c WHEN isnumeric(...) ... 时,pci1__c(即varchar)将与integer 进行比较。为了能够进行这种比较,DBMS 希望将varchar 向上转换为integer。这会失败,因为(预期的)integer 表示不包含小数点。

自 2012 年以来,try_convert() 可用。它会在可能的情况下进行转换,否则返回NULL

SELECT try_convert(decimal(10, 2), pci1__c) pci1__c
       FROM mx_credit_analysis;

【讨论】:

    【解决方案2】:

    如果你想使用CASE,那么

    查询

    select 
        case when ISNUMERIC(rtrim(ltrim([PCI1__c]))) = 1
        then convert(decimal(10, 2), PCI1__c)
        else null end as PCI1__c 
    from [MX_CREDIT_ANALYSIS];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2018-04-07
      • 2013-04-18
      • 2019-06-07
      相关资源
      最近更新 更多