某表a (a double)
1
1.3
1.2
0.5666
1.2345....
取某个字段小数点后面超过3位的字段值的sql,如何写
(执行这个sql
将仅仅取上面的数据
0.5666
1.2345其他的不要)
(mysql  +linux)

解决方案 »

  1.   

    mysql> select * from t_liyihongcug;
    +--------+
    | a      |
    +--------+
    |      1 |
    |    1.3 |
    |    1.2 |
    | 0.5666 |
    | 1.2345 |
    +--------+
    5 rows in set (0.00 sec)mysql> select * from t_liyihongcug
        -> where ROUND(a,3)!=a;
    +--------+
    | a      |
    +--------+
    | 0.5666 |
    | 1.2345 |
    +--------+
    2 rows in set (0.00 sec)mysql>当您的问题得到解答后请及时结贴.
    http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
      

  2.   

    感谢我的解答
    where LENGTH(a)-LOCATE('.', a) >3
      

  3.   

    select * ...
        -> where ROUND(a,3)!=a;
    有时候不准确。   不知道真么回事 
      where LENGTH(a)-LOCATE('.', a) >3  查找出数据为空
    但where ROUND(a,3)!=a;
    查处数据还有值  但他的值都是 1.97  2.78  等不符合要求的数据。 (所以最终我选择了后者)
    where ROUND(a,3)!=a;
    查处数据还有值  但他的值都是 1.97  2.78  等不符合要求的数据?是什么原因 (是否该数据默认不足5为
    如1.97 实际上是 1.97000 这样存储的? ?)
      

  4.   

    没有出现你所说的问题。
    mysql> select * from t_liyihongcug;
    +--------+
    | a      |
    +--------+
    |      1 |
    |    1.3 |
    |    1.2 |
    | 0.5666 |
    | 1.2345 |
    |   1.97 |
    |   2.78 |
    +--------+
    7 rows in set (0.00 sec)mysql> select * from t_liyihongcug where ROUND(a,3)!=a;
    +--------+
    | a      |
    +--------+
    | 0.5666 |
    | 1.2345 |
    +--------+
    2 rows in set (0.00 sec)mysql> desc t_liyihongcug;
    +-------+--------+------+-----+---------+-------+
    | Field | Type   | Null | Key | Default | Extra |
    +-------+--------+------+-----+---------+-------+
    | a     | double | YES  |     | NULL    |       |
    +-------+--------+------+-----+---------+-------+
    1 row in set (0.06 sec)mysql>
      

  5.   

    反复测试  知道了原因楼上的   ROUND(a,3)!=a; 仅仅适合 a为double的字段类型 , 他对a是float是无能为力的
    但是我的where LENGTH(a)-LOCATE('.', a) >3 适合任何情况 。
     ---这是精确的结论
      

  6.   

    感谢楼上 没有办法 在线数据类型过于丰富 刚才的查询已经运用到很多的哦表
     ROUND(a,3)!=a; 为什么不能对float 起作用 , ??? 
      

  7.   

    我新建了表测试 确实如此。---意外收获
    说明mysql的函数的使用 要很谨慎。
      

  8.   

    1。建议下次提供测试说明的时候要仔细,某表a (a double),别人自然会用double来测试。
    2。建议注意你的结帖率:70.83%
    3。不是函数的问题,是数据精度的问题。float 只有4字节,而double有8字节,任何一种浮点数都有精度损失。http://dev.mysql.com/doc/refman/5.1/zh/precision-math.html
    24. 精度数学
    24.1. 数值的类型
    24.2. DECIMAL数据类型更改
    24.3. 表达式处理
    24.4. 四舍五入
    24.5. 精度数学示例
      

  9.   

    mysql> select * from t_liyihongcug_b;
    +--------+
    | a      |
    +--------+
    |      1 |
    |    1.3 |
    |    1.2 |
    | 0.5666 |
    | 1.2345 |
    |   1.97 |
    |   2.78 |
    +--------+
    7 rows in set (0.00 sec)mysql> select * from t_liyihongcug_b where ROUND(CAST(a AS DECIMAL(10,5)) ,3)!=CAST(a AS DECIMAL(10,5)) ;
    +--------+
    | a      |
    +--------+
    | 0.5666 |
    | 1.2345 |
    +--------+
    2 rows in set (0.00 sec)mysql>