Страницы

Поиск по вопросам

понедельник, 2 марта 2020 г.

UPDATE IF ELSE Mysql

#mysql #update #if #else


UPDATE personal_card SET

if bank_book >= price_tariff
    bank_book = bank_book - price_tariff, 
    bank_pay = bank_pay + price_tariff, 
    stop_date = DATE_ADD(CURDATE(),Interval 1 MONTH)
else
    pay_status = '0'

WHERE stop_date = CURDATE() 


Не могу разобраться в условиях IF ELSE, проверяем bank_book >= price_tariff, если
TRUE до выполняем условие, если нет, то изменяем pay_status = '0'. Понимаю что можно
сделать двумя разными запросами, но мне кажется что в одном, это правильнее.

Спасибо!
    


Ответы

Ответ 1



Дополнительная переменная заведена чтобы не выполнять проверку для всех полей, а только один раз на строку. Первый вариант: SET @MyVar = 1; UPDATE personal_card SET bank_book = IF(@MyVar := bank_book >= price_tariff, bank_book - price_tariff, bank_book), bank_pay = IF(@MyVar, bank_pay + price_tariff, bank_pay), stop_date = IF(@MyVar, DATE_ADD(CURDATE(),Interval 1 MONTH), stop_date), pay_status = IF(@MyVar, 1, 0) WHERE stop_date = CURDATE() Второй вариант: SET @MyVar = 1; UPDATE personal_card SET bank_book = (CASE WHEN @MyVar := bank_book >= price_tariff THEN bank_book - price_tariff ELSE bank_book END), bank_pay = (CASE WHEN @MyVar THEN bank_pay + price_tariff ELSE bank_pay END), stop_date = (CASE WHEN @MyVar THEN DATE_ADD(CURDATE(),Interval 1 MONTH), ELSE stop_date END), pay_status = (CASE WHEN @MyVar THEN 1 ELSE 0 END) WHERE stop_date = CURDATE(); Третий вариант: UPDATE personal_card SET bank_book = bank_book - price_tariff, bank_pay = bank_pay + price_tariff, stop_date = DATE_ADD(CURDATE(),Interval 1 MONTH), pay_status = 1 WHERE bank_book >= price_tariff AND stop_date = CURDATE(); UPDATE personal_card SET pay_status = 1 WHERE bank_book < price_tariff AND stop_date = CURDATE();

Ответ 2



UPDATE personal_card SET bank_book = IF(bank_book >= price_tariff, bank_book - price_tariff, bank_book), bank_pay = IF(bank_book >= price_tariff, bank_pay + price_tariff, bank_pay), stop_date = IF(bank_book >= price_tariff, DATE_ADD(CURDATE(),Interval 1 MONTH), stop_date), pay_status = IF(bank_book >= price_tariff, '0', '1') WHERE stop_date = CURDATE() Сделал так. На сколько это грамотно? Если будет более 1000 строк?

Комментариев нет:

Отправить комментарий