У меня есть этот запрос:
$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)