Mysql内部连接和舍入以零精度

时间:2011-06-01 12:48:04

标签: mysql rounding

我试图在两个表上执行内连接,以便我可以通过与另一个表中该值的pid相关联的精度来舍入值。但是,它为pid 3返回NULL。我认为它与pid 2的NULL精度有关,因为当我将它的精度设置为非NULL值时,我在下面的查询中得到pid 3的正确值。

如何重构此查询,以便即使另一个pid包含NULL精度,它也将始终返回正确的值?

select pid_values.pid, pid_values.value, round(value, pids.precision) 
from pid_values inner join pids on pid_values.pid = pids.pid;

+------+--------+------------------------------+
| pid  | value  | round(value, pids.precision) |
+------+--------+------------------------------+
|    1 | 10.123 |                           10 |
|    2 |    5.5 |                            6 |
|    3 | 3.1234 |                         NULL |
+------+--------+------------------------------+

两个表中的数据:

select * from pids;
+------+-----------+
| pid  | precision |
+------+-----------+
|    1 |         0 |
|    2 |      NULL |
|    3 |         1 |
+------+-----------+

select * from pid_values
+----+------+--------+
| id | pid  | value  |
+----+------+--------+
|  1 |    1 | 10.123 |
|  2 |    2 |    5.5 |
|  3 |    3 | 3.1234 |
+----+------+--------+

2 个答案:

答案 0 :(得分:2)

尝试此查询:

SELECT 
  pid_values.pid, 
  pid_values.value, 
  round(value, IF(pids.precision IS NULL, 0, pids.precision)) 
FROM pid_values INNER JOIN pids ON pid_values.pid = pids.pid;

答案 1 :(得分:2)

不要将NULL传递给round。试试这个:

SELECT 
 pid_values.pid, 
 pid_values.value, 
 if( pids.precision IS NULL , NULL , round( value, pids.precision ) ) 
FROM pid_values
INNER JOIN pids 
ON pid_values.pid = pids.pid;

Hck似乎和我有同样的想法,但实现方式不同。在precision IS NULL时,我会将结果返回NULL(如您的示例中所示,并且与precision =0不同),而他将转换为整数。选择最适合您需求的产品。