【问题标题】:Mysql inner join and rounding with null precisionMysql内部联接和以空精度舍入
【发布时间】:2011-06-01 12:48:03
【问题描述】:

我正在尝试在两个表上执行内部联接,以便我可以按与另一个表中该值的 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 |
+----+------+--------+

【问题讨论】:

  • 听起来更像是 MySQL 中的一个错误......(另外,我实际上希望 pid = 2 的那个返回 null,基于 round() 应该在 null 上返回 null输入。)
  • 实际上,一旦您将NULL 作为D 传递给ROUND,所有后续对ROUND 的调用(在该查询中)都会返回NULL
  • 所以,问题是:当precision IS NULL 时,您希望它返回什么? NULL,四舍五入为 0,或0?
  • 查看 MySQL 错误 5542355365

标签: mysql rounding


【解决方案1】:

试试这个查询:

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;

【讨论】:

    【解决方案2】:

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

    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 不同),而他将四舍五入为整数。选择最适合您的需求。

    【讨论】:

      猜你喜欢
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 2017-03-03
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多