Mysql CASE WHEN выполняется, даже если условие неверно

пожалуйста, посмотрите на изображение, вы найдете mysql CASE WHEN, даже если условие ложно

_skus

sku_id  is_available  is_quantity   quantity 

 13       1            0                NUll
UPDATE _skus 
  SET is_available = CASE 
    WHEN is_quantity = 1 AND quantity=0  THEN 0  
  END  
WHERE sku_id=13

после выполнения оператора MySQL

sku_id  is_available  is_quantity   quantity 

 13       0           0                NUll

is_available обновлен до 0, даже если условие неверно

таблица _skus

CREATE TABLE `_skus`  (
  `sku_id` int(11) NOT NULL AUTO_INCREMENT,
  `is_available` tinyint(1) NOT NULL,
  `is_quantity` tinyint(1) NOT NULL,
  `quantity` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`sku_id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;


INSERT INTO `_skus` VALUES (13, 1, 0, NULL);
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете исправить это, удалив CASE и переместив условия is_quantity = 1 and quantity=0 в часть WHERE:

UPDATE _skus
   SET is_available = 0  
 WHERE sku_id = 13
   AND is_quantity = 1 
   AND quantity = 0;
Ответ принят как подходящий

Основная проблема заключается в следующем:

UPDATE TABLE xy
SET col = CASE WHEN ... END
WHERE condition

определяется для применения ко всем строкам таблицы, где встречается WHERE condition. Т.е. даже если условие CASE не выполняется, со значением col нужно что-то сделать... для этой строки. Таким образом, в качестве возврата из CASE используется неявное значение по умолчанию. Кажется, в вашем случае это 0. Не знаю, почему это вообще работает для вас. Если я запущу ваш пример в dbfiddle, я получу ошибку, потому что CASE возвращает NULL как значение по умолчанию, когда условие WHEN не выполняется. Но NULLне разрешено для столбца is_available.

Есть две возможности

  1. Переместите условие в предложение WHERE, чтобы UPDATE распространялось только на строки с этим конкретным условием.

     UPDATE _skus
       SET is_available = 0
     WHERE is_quantity = 1 AND quantity = 0 AND  sku_id = 13
    
  2. Добавьте в свой случай ветку ELSE со значением по умолчанию, которое будет установлено, если условие не выполнено. Например, вы можете использовать текущее значение is_available в качестве значения по умолчанию.

     UPDATE _skus
       SET is_available = CASE 
         WHEN is_quantity = 1 AND quantity = 0 THEN 0
         ELSE is_available
       END
     WHERE sku_id = 13
    

Вариант (1), по-видимому, подойдет здесь, поскольку вы уже фильтруете одну конкретную строку для обновления. Таким образом, вы можете легко добавить дополнительное условие, чтобы определить, необходимо обновление или нет.

Другие вопросы по теме