Умножьте в SQL, только если результат не равен NULL - PullRequest
0 голосов
/ 09 января 2019

У меня следующий запрос:

SELECT (COUNT(DISTINCT CASE WHEN houses.level = 'top' THEN users.id END)::float / NULLIF(COUNT(DISTINCT users.id)::float, 0)) 
FROM users
LEFT JOIN houses ON houses.user_id = users.id

И вместо отношения я хочу вернуть процент, поэтому я изменил его на:

SELECT (COUNT(DISTINCT CASE WHEN houses.level = 'top' THEN users.id END)::float / NULLIF(COUNT(DISTINCT users.id)::float, 0)) * 100
FROM users
LEFT JOIN houses ON houses.user_id = users.id

Однако, если знаменатель (NULLIF(COUNT(DISTINCT users.id)::float, 0)) возвращает ноль, это означает, что я буду умножать NULL * 100. Как я могу просто вернуть NULL без умножения, если знаменатель равен 0 (и, следовательно, ноль из-за NULLIF) .

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Если вы хотите, чтобы NULL представлял 0%, используйте COALESCE:

SELECT COALESCE((COUNT(DISTINCT CASE WHEN houses.level = 'top' THEN users.id END)::float / NULLIF(COUNT(DISTINCT users.id)::float, 0)) * 100, 0) ...

COALESCE возвращает первую ненулевую вещь, с которой сталкивается, работая слева направо

В противном случае, пойти на то, что рекомендует Нобита; пусть ноль будет ноль

0 голосов
/ 09 января 2019

Можно умножить INT на NULL. Результат по-прежнему будет равен NULL.

Попробуйте сами:

SELECT NULL * 100
...