Mysql внутреннее соединение и округление с нулевой точностью - PullRequest
1 голос
/ 01 июня 2011

Я пытаюсь выполнить внутреннее соединение двух таблиц, чтобы можно было округлить значение по точности, связанной с pid этого значения в другой таблице. Тем не менее, он возвращает NULL для pid 3. Я полагаю, что это связано с точностью NULL для pid 2, потому что, когда я устанавливаю его точность, отличную от 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 ]

2 голосов
/ 01 июня 2011

Не передавайте 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), а вместо этого он округлит до целого числа.Выберите то, что подходит вам больше всего.

2 голосов
/ 01 июня 2011

Попробуйте этот запрос:

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;
...