Поскольку условия в вашем выражении CASE
не совпадают с условиями в вашем предложении WHERE
, вам нужно выражение ELSE
в вашем выражении CASE
, чтобы, когда ни одно из условий WHEN
не выполнялось, вы не возвращают значение NULL
, которое затем вызывает
reserved - (CASE ...)
будет NULL
, давая вам ошибку, которую вы видите. Попробуйте это:
Update inventory set reserved = reserved -
CASE
WHEN location_id = 23 and variant_id = 40 then 2
WHEN location_id = 13 and variant_id = 20 and reserved > 0 then 3
ELSE 0
end
where (location_id = 23 and variant_id = 40) or
(location_id = 13 and variant_id = 20);
В качестве альтернативы, чтобы предотвратить падение значения ниже 0, вы можете рассмотреть возможность использования LEAST
для предотвращения вычитания значения, которое больше текущего значения reserved
, например
Update inventory set reserved = reserved -
CASE
WHEN location_id = 23 and variant_id = 40 then LEAST(2, reserved)
WHEN location_id = 13 and variant_id = 20 then LEAST(3, reserved)
end
where (location_id = 23 and variant_id = 40) or
(location_id = 13 and variant_id = 20);