У меня есть этот запрос:
$db->prepare("UPDATE users SET reputation = reputation + (CASE WHEN id = ? THEN 2 WHEN id = ? AND NOT ? THEN 15 END) WHERE id IN (?, ?); ") ->execute(array($author_ques_id, $author_ans_id, $isOwnAnswer, $author_ans_id, $author_ques_id));
Пожалуйста, сосредоточьтесь на этой строке:
WHEN id = ? AND NOT ? THEN 15 END)
Когда NOT ? false (другими словами $isOwnAnswer = true ) , значение reputatuin для такого пользователя будет NULL . Потому что reputation = reputation + NULL оценивает reputation = NULL .
Ну, как я могу это предотвратить? Я хочу, когда это условие ложно , тогда reputation не меняется.
Не нужно обертывать его другим CASE/COALESCE/IFNULL или что угодно, просто используйте CASE EXPRESSION ELSE , в случае, если все условия не выполняются, будет использоваться ELSE .
UPDATE users SET reputation = reputation + CASE WHEN id = ? THEN 2 WHEN id = ? AND NOT ? THEN 15 ELSE 0 END WHERE id IN (?, ?);
Использовать COALESCE :
UPDATE users SET reputation = reputation + COALESCE((CASE WHEN id = ? THEN 2 WHEN id = ? AND NOT ? THEN 15 END), 0)