2016-06-16 2 views
3

У меня есть этот запрос:Как заменить NULL на 0 в запросе?

$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 ? является ложным(другими словами $isOwnAnswer = true), величина reputatuin для такого пользователя будет NULL. Потому что reputation = reputation + NULL оценивает reputation = NULL.

Хорошо, как я могу предотвратить это? Я хочу, когда это условие false, затем reputation не меняется.

ответ

3

Нет необходимости, чтобы обернуть его с другим CASE/COALESCE/IFNULL или что-нибудь, просто использовать CASE EXPRESSIONELSE, в случае, если все эти условия не выполняются, то ELSE будет использоваться.

UPDATE users 
      SET reputation = reputation + 
          CASE WHEN id = ? THEN 2 
           WHEN id = ? AND NOT ? THEN 15 
           ELSE 0 
          END 
      WHERE id IN (?, ?); 
+0

Добавление 'ELSE 0' кажется умным .. thx +1 – stack

2

Использование COALESCE:

UPDATE users 
SET reputation = reputation + 
       COALESCE((CASE 
          WHEN id = ? THEN 2 
          WHEN id = ? AND NOT ? THEN 15 
          END), 0) 
+0

Got it .. спасибо. Почему же не 'IFNULL()'? – stack

+0

@stack Это то же самое, я не думаю, что это имеет разницу в производительности. –

+0

Я вижу ... thx +1 – stack

Смежные вопросы