【问题标题】:Error converting data type varchar to numeric when converting substring to decimal将子字符串转换为十进制时,将数据类型 varchar 转换为数字时出错
【发布时间】:2017-08-23 10:11:18
【问题描述】:

我有一个表,其中包含一个 VARCHAR 列,其中填充了诸如

之类的值

员工无权享受 SSP,因为他们的平均每周收入低于 LEL。平均收入:44.13750 英镑

我正在尝试提取 £ 符号后的值,所以我尝试了:

SELECT 
    ClientId
    , Max(PayPeriod) As PeriodNo
, CASE WHEN MAX(Comment) like '%£%' THEN 
    CAST(MAX(right(Comment, charindex('£', reverse(Comment))-1) )AS DECIMAL(5,2)) 
    ELSE 0 END AS AvgEarnings2      
FROM 
    t_PayrollSSPEmployeeComment 
WHERE 
    comment like '%LEL%' AND comment like '%£%'
        GROUP BY 
            ClientID

我只想检索该值,以便可以将其转换为十进制,例如 110.25

但我收到一个错误

Error converting data type varchar to numeric.

我可以获取带有或不带有 £ 符号的值,但我需要将其转换为正确的小数位数才能生成报告。 我在这里做错了什么?

【问题讨论】:

  • 听起来你的字符串值中有一些非法字符。也许你的小数点?

标签: sql-server tsql decimal varchar


【解决方案1】:

你可以试试这个,SUBSTRING函数可以用来提取字符£之后的数字。

    SELECT 
    ClientId
    ,Max(PayPeriod) As PeriodNo
    ,CASE WHEN MAX(Comment) like '%£%' THEN      
     CAST(SUBSTRING(MAX(Comment),2,LEN(MAX(Comment))) AS DECIMAL(18,2))
        ELSE 0 END AS AvgEarnings2      
    FROM t_PayrollSSPEmployeeComment 
    WHERE comment like '%LEL%' AND comment like '%£%'
     GROUP BY ClientID

【讨论】:

  • 谢谢,但现在我有一个错误Arithmetic overflow error converting varchar to data type numeric.
  • @OurManinBananas 你能用DECIMAL(18,2) 更新的答案试试吗,我希望你的评论栏除了£ 之外没有任何其他字符。
  • 我试过了,同样的错误,所以必须更仔细地检查字符串,去掉换行等所有内容
  • @OurManinBananas 没有任何样本数据,很难提供任何好的解决方案。
  • 我添加了一些示例数据
【解决方案2】:

如果您使用的是 SQL Server 2012 或更高版本,请使用 Try_Convert 函数:

Try_Convert (Decimal(5, 2), MAX(right(Comment, charindex('£', reverse(Comment))-1) ))

看看,无论你的错误代码没有将表达式转换为十进制类型,而不是错误,结果将是 null 并检查该值的问题。

【讨论】:

    猜你喜欢
    • 2013-04-27
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 2013-09-28
    • 1970-01-01
    相关资源
    最近更新 更多