zoukankan      html  css  js  c++  java
  • 小数点引起的数据类型转换问题

    同事运行一段sql报错,显示:无法从varcahr转化为numeric。此字段是varchar型。

    --1. 报错:无法从varcahr转化为numeric
    SELECT sum(CAST(jg AS NUMERIC(10,2)))
    FROM RPT_DIST_RULE
    
    
    
    --2. 还是会报错
    SELECT sum(CAST(jg AS NUMERIC(10,2)))
    FROM RPT_DIST_RULE
    WHERE isnumeric(jg) = 1 --只过滤数值
    
    
    
    --3. 没有返回记录,说明jg字段中不包含空格
    SELECT sum(CAST(jg AS NUMERIC(10,2)))
    FROM RPT_DIST_RULE
    WHERE jg LIKE '% %' --等于空格
    
    
    
    --4. 计算此字段的长度
    SELECT jg,
           len(jg)
    FROM RPT_DIST_RULE
    
    
    --4.2 进一步通过去重,缩小数据条数,这样更容易发现错误数据
    --    按照此字段的长度从小到大排序,发现有的字符串为'.'或'.5'
    SELECT DISTINCT 
           jg,
           len(jg)
    FROM RPT_DIST_RULE
    ORDER BY 2
    
    
    
    --5.1 验证了确实当字符串为'.'时,进行转化会报错
    SELECT CAST(a AS NUMERIC(10,2))
    from
    (
      	SELECT '.' a	
    )a
    
    
    --5.2 而当字符串为'.5'时,转化不会报错
    SELECT CAST(a AS NUMERIC(10,2))
    from
    (
    	SELECT '.5' a
    )a
    
    
    --5.3 另外,在用isnumeric函数判断一个字符串是否为数值时,都会返回1,也就是都是数值
    SELECT a,
           isnumeric(a) 
    from
    (
    	SELECT '.5' a
    	UNION ALL
    	SELECT '.' a
    )a
    
    
    
    --6. 本质上,这种错误是由于客户端没有控制好导致的,客户端可以通过正则表达式来限制输入字符
    --   对于本例,直接通过把'.'更新为'0'来解决。
    UPDATE RPT_DIST_RULE
    SET jg = '0'
    WHERE jg = '.'


     

  • 相关阅读:
    记录相关操作
    mysql数据类型
    完整性约束
    表相关操作
    MySQL存储引擎
    库相关操作
    linux学习笔记2---命令cd
    linux学习笔记命令篇1---命令ls
    linux常用命令系列
    redis34--string 操作
  • 原文地址:https://www.cnblogs.com/momogua/p/8304582.html
Copyright © 2011-2022 走看看