Вложенные операторы CASE в MySQL
Я впервые работаю с CASE-логикой в SQL-операторах. Все работает, если я удаляю операторы CASE, поэтому SQL допустим и без них.
Мне нужно рассчитать общую цену товара, основываясь на нескольких вещах.
Если "цена продажи "является активным и "опцион Upcharge" имеет значение, то итого: Qty * (цена продажи + опцион Upcharge)
Если "цена продажи неактивна и "опцион Upcharge" имеет значение, то итого: кол-во * (цена + опцион Upcharge)
Если "цена продажи "является активной и "опцион Upcharge" не имеет значения, общая сумма равна: Qty * цена продажи
Если "цена продажи неактивна и "опцион Upcharge" не имеет значения, то итого получается: кол-во * Цена
Если опция не была добавлена, значение для tblproduct_options.option_upcharge является нулевым в выводе.
Спасибо за помощь.
Бретт
Вот мой SQL:
SELECT tblshopping_cart.session_id, tblshopping_cart.product_id, tblshopping_cart.product_qty, tblshopping_cart.product_option, tblproducts.product_title, tblproducts.product_price, tblproducts.product_sale_price_status, tblproducts.product_sale_price, tblproduct_options.option_text, tblproduct_options.option_upcharge,
CASE
WHEN (tblproducts.product_sale_price_status = 'Y')
CASE
WHEN (tblproduct_options.option_upcharge IS NOT NULL)
THEN (tblshopping_cart.product_qty * (tblproducts.product_sale_price + tblproduct_options.option_upcharge))
ELSE (tblshopping_cart.product_qty * tblproducts.product_sale_price)
END
ELSE
CASE
WHEN (tblproduct_options.option_upchage IS NOT NULL)
THEN (tblshopping_cart.product_qty * (tblproducts.product_price + tblproduct_options.option_upcharge))
ELSE (tblshopping_cart.product_qty * tblproducts.product_price)
END
END AS product_total
FROM tblshopping_cart
INNER JOIN tblproducts ON tblshopping_cart.product_id = tblproducts.product_id
LEFT JOIN tblproduct_options ON tblshopping_cart.product_option = tblproduct_options.option_product_id
ORDER BY tblshopping_cart.product_qty ASC
Он терпит неудачу с с сообщение:
CASE
WHEN (tblproduct_options.option_upcharge IS NOT NULL)
THEN (tblshopping_' at line 4
3 ответов:
Вы пропускаете
THENв своем первом утвержденииCASE. (извините, что пришлось добавить псевдонимы таблиц )SELECT sc.session_id , sc.product_id , sc.product_qty , sc.product_option , p.product_title , p.product_price , p.product_sale_price_status , p.product_sale_price , po.option_text , po.option_upcharge , CASE WHEN (p.product_sale_price_status = 'Y') THEN <-- add this CASE WHEN (po.option_upcharge IS NOT NULL) THEN (sc.product_qty * (p.product_sale_price + po.option_upcharge)) ELSE (sc.product_qty * p.product_sale_price) END ELSE CASE WHEN (po.option_upchage IS NOT NULL) THEN (sc.product_qty * (p.product_price + po.option_upcharge)) ELSE (sc.product_qty * p.product_price) END END AS product_total FROM tblshopping_cart sc INNER JOIN tblproducts p ON sc.product_id = p.product_id LEFT JOIN tblproduct_options po ON sc.product_option = po.option_product_id ORDER BY sc.product_qty ASC
Похоже, что вы пропускаете
THENво внешнемCASE:CASE WHEN (tblproducts.product_sale_price_status = 'Y') THEN ^^^^ add this
Я думаю, что ваша проблема заключается в том, как вы пишете свое дело.
Вы пропустили тогда после вашего первого когда. Вы также пропустили конец.
CASE WHEN (tblproducts.product_sale_price_status = 'Y') THEN CASE WHEN (tblproduct_options.option_upcharge IS NOT NULL) THEN (tblshopping_cart.product_qty * (tblproducts.product_sale_price + tblproduct_options.option_upcharge)) ELSE (tblshopping_cart.product_qty * tblproducts.product_sale_price) END ELSE CASE WHEN (tblproduct_options.option_upchage IS NOT NULL) THEN (tblshopping_cart.product_qty * (tblproducts.product_price + tblproduct_options.option_upcharge)) ELSE (tblshopping_cart.product_qty * tblproducts.product_price) END END AS product_total
Comments