MySQL IF ELSEIF у запиті на вибір


81

Я намагаюся вибрати різні ціни на товар, виходячи з кількості, яку обрав користувач. Це запит, над яким я працюю (він має синтаксичну помилку):

 select id, 
    (SELECT 
    IF(qty_1<='23',price,1)
    ELSEIF(('23'>qty_1 && qty_2<='23'),price_2,1)
    ELSEIF(('23'>qty_2 && qty_3<='23'),price_3,1)
    ELSEIF('23'>qty_3,price_4,1)
    END IF) as total 
 from product;

7
вам слід використовувати CASE
Sir Rufo

Відповіді:


202

У вас є те, що ви використовували в сховищах таких процедур для довідки, але вони не призначені для використання, як ви зараз. Ви можете використовувати, IFяк показано duskwuff. Але Caseтвердження краще для очей. Подобається це:

select id, 
    (
    CASE 
        WHEN qty_1 <= '23' THEN price
        WHEN '23' > qty_1 && qty_2 <= '23' THEN price_2
        WHEN '23' > qty_2 && qty_3 <= '23' THEN price_3
        WHEN '23' > qty_3 THEN price_4
        ELSE 1
    END) AS total
 from product;

Це виглядає чистішим. Думаю, ти все одно не потребуєш внутрішнього SELECT..


2
Так, справді, це виглядає краще, я оберу цей варіант, але добре мати обидва підходи для подальших посилань .. Дякую nawfal
Іван Браво Карлос

Приємно, що CASE використовується для IF. Спасибі Nawfal
Satya Kalluri

20

IF()в MySQL - це потрійна функція, а не структура управління - якщо умова в першому аргументі є істинним, він повертає другий аргумент; в іншому випадку він повертає третій аргумент. Немає відповідної ELSEIF()функції або END IFключового слова.

Найближчим еквівалентом того, що ви отримали, буде щось на зразок:

IF(qty_1<='23', price,
  IF('23'>qty_1 && qty_2<='23', price_2,
    IF('23'>qty_2 && qty_3<='23', price_3,
      IF('23'>qty_3, price_4, 1)
    )
  )
)

Не всі умови для мене мають сенс (здається, деякі з них можуть бути ненавмисно змінені?), Але, не знаючи, що саме ви намагаєтесь досягти, мені важко це виправити.


я зрозумів це хвилину тому ... виберіть productoid, precio, precio_2, precio_3, IF (cant_1> 23, precio, IF (23> cant_1 && cant_2> 23, precio_2, IF (23> cant_2 && cant_3> 23, precio_3 , ЯКЩО (23> cant_4, precio_4,1)))), оскільки в цілому від продукту, річ у тому, що я не можу створити окрему таблицю цін через запит мого боса, що було б набагато простіше зробити приєднання та отримати ціна на основі кількості ...
Іван Браво Карлос

більш case when (condition) then {computed value} when then else end
близька

9

Я знайшов помилку в MySQL 5.1.72 при використанні вкладених функцій if () .... значення змінних стовпців (наприклад, qty_1) порожнє всередині другого if (), що робить його марним. Замість цього використовуйте таку конструкцію:

case 
  when qty_1<='23' then price
  when '23'>qty_1 && qty_2<='23' then price_2
  when '23'>qty_2 && qty_3<='23' then price_3
  when '23'>qty_3 then price_4
  else 1
end

4

Для вашого запитання:

SELECT id, 
   IF(qty_1 <= '23', price,
   IF(('23' > qty_1 && qty_2 <= '23'), price_2,
   IF(('23' > qty_2 && qty_3 <= '23'), price_3,
   IF(('23' > qty_2 && qty_3<='23'), price_3,
   IF('23' > qty_3, price_4, 1))))) as total 
FROM product;

Ви можете використовувати if - elseструктуру управління або IFфункцію в MySQL.

Посилання:
http://easysolutionweb.com/sql-pl-sql/how-to-use-if-and-else-in-mysql/


1
Хоча ваша відповідь на 100% правильна, вона також може стати на 100% марною, якщо це посилання перемістити, змінити, об’єднати в інший або головний сайт просто зникне ... :-( Тому, будь ласка, відредагуйте свою відповідь та скопіюйте відповідну кроки від посилання до вашої відповіді, тим самим гарантуючи вашу відповідь протягом 100% життя цього сайту! ;-) Ви завжди можете залишити посилання внизу відповіді як джерело для вашого матеріалу ...
Дональд Дак

2

Відповідно до відповіді Ноффала, твердження про ПФ повинні бути в процедурі. Я знайшов цю публікацію, яка показує блискучий приклад використання вашого сценарію в процедурі при розробці та тестуванні. В основному, ви створюєте, викликаєте, а потім скидаєте процедуру:

https://gist.github.com/jeremyjarrell/6083251

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.