Это выражение:
CASE COUNT(measurement.id) > 1 THEN to_char(COUNT(measurement.id),' 999') ELSE ''
не медленно, потому что COUNT()
вызывается дважды. Трудная работа по агрегированию данных - это та часть, в которой ключевые значения объединены. Отдельные функции агрегации обычно не особенно дороги (есть исключения, такие как COUNT(DISTINCT)
). Таким образом, даже если бы это вызывалось несколько раз, это не было проблемой.
Вы можете изменить запрос на что-то более загадочное, как:
coalesce(to_char(nullif(count(measurement.id), 0), '999')), '')
Это происходит подсчет 0, преобразует его в NULL
, который затем превращается в пустую строку (и я думаю это было только оценивайте аргумент один раз в Postgres, хотя SQL Server будет оценивать его дважды, и в этом случае вы используете isnull()
вместо coalesce()
). Я предпочитаю вашу версию, если вы чувствуете необходимость конвертировать красивые числа в строки.
РЕДАКТИРОВАТЬ:
COUNT()
, как представляется, определяется как «неизменны», который является еще более сильным, чем «стабильный». Я даже не уверен, что это правильно, но это так на SQL Fiddle. В любом случае, он, вероятно, не вызывается дважды, но дорогая часть - это GROUP BY
.
Счет будет оцениваться только один раз. –
Было бы здорово, это где-то в документах? – RemcoGerlich
@RemcoGerlich. , , Это очень сильно подразумевается в определении волатильности (http://www.postgresql.org/docs/9.4/static/xfunc-volatility.html). Я предполагаю, что это относится к функциям агрегации и что 'COUNT()' должным образом объявляется стабильным. –