MySQL IF ELSEIF in Auswahlabfrage

79

Ich versuche, unterschiedliche Preise für ein Produkt basierend auf der vom Benutzer ausgewählten Menge auszuwählen. Dies ist die Abfrage, an der ich arbeite (sie hat einen Syntaxfehler):

 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;
Ivan Bravo Carlos
quelle
7
Sie sollten CASE
Sir Rufo

Antworten:

198

Sie haben das, was Sie in gespeicherten Prozeduren wie dieser verwendet haben, als Referenz, aber sie sind nicht dazu gedacht, wie jetzt verwendet zu werden. Sie können IFwie gezeigt verwenden duskwuff. Aber eine CaseAussage ist besser für die Augen. So was:

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;

Das sieht sauberer aus. Ich nehme an, du brauchst SELECTsowieso nicht das Innere .

nawfal
quelle
2
Ja, es sieht in der Tat besser aus, ich werde diese Option wählen, aber es ist gut, beide Ansätze für zukünftige Referenzen zu haben. Danke nawfal
Ivan Bravo Carlos
Schön, dass CASE für IF verwendet wird. Danke Nawfal
Satya Kalluri
20

IF()in MySQL ist eine ternäre Funktion, keine Kontrollstruktur - wenn die Bedingung im ersten Argument wahr ist, wird das zweite Argument zurückgegeben; Andernfalls wird das dritte Argument zurückgegeben. Es gibt keine entsprechende ELSEIF()Funktion oder ein entsprechendes END IFSchlüsselwort.

Das nächste Äquivalent zu dem, was Sie haben, wäre etwa:

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)
    )
  )
)

Die Bedingungen sind für mich nicht alle sinnvoll (es sieht so aus, als ob einige von ihnen versehentlich umgekehrt werden könnten?), Aber ohne zu wissen, was genau Sie erreichen wollen, fällt es mir schwer, das zu beheben.

Dämmerung -inaktiv-
quelle
Ich finde das vor einer Minute heraus ... wähle 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) , IF (23> cant_4, precio_4,1)))) als Summe von producto ist die Sache, dass ich aufgrund der Anfrage meiner Chefs keine eigenständige Preistabelle erstellen kann, die viel einfacher wäre, eine Verbindung herzustellen und die zu erhalten Preis basierend auf der Menge ...
Ivan Bravo Carlos
eine nähere Sache würde verwendencase when (condition) then {computed value} when then else end
ahnbizcad
9

Ich habe in MySQL 5.1.72 einen Fehler gefunden, als ich die verschachtelten if () -Funktionen verwendet habe. Der Wert der Spaltenvariablen (z. B. qty_1) ist innerhalb des zweiten if () leer, was ihn unbrauchbar macht. Verwenden Sie stattdessen das folgende Konstrukt:

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
Dave Crooke
quelle
4

Für Ihre Frage:

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;

Sie können die if - elseKontrollstruktur oder die IFFunktion in MySQL verwenden.

Referenz:
http://easysolutionweb.com/sql-pl-sql/how-to-use-if-and-else-in-mysql/

Dilraj Singh
quelle
1
Obwohl Ihre Antwort zu 100% korrekt ist, kann sie auch zu 100% unbrauchbar werden, wenn dieser Link verschoben, geändert, in eine andere zusammengeführt wird oder die Hauptseite einfach verschwindet ... :-( Bearbeiten Sie daher bitte Ihre Antwort und kopieren Sie die entsprechende Schritte vom Link in Ihre Antwort, wodurch Ihre Antwort für 100% der Lebensdauer dieser Website garantiert wird! ;-) Sie können den Link jederzeit am Ende Ihrer Antwort als Quelle für Ihr Material belassen ...
Donald Duck
2

Gemäß der Antwort von Nawfal müssen sich IF-Anweisungen in einem Verfahren befinden. Ich habe diesen Beitrag gefunden, der ein brillantes Beispiel für die Verwendung Ihres Skripts in einer Prozedur zeigt, während Sie noch entwickeln und testen. Grundsätzlich erstellen Sie, rufen Sie auf und lassen die Prozedur fallen:

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

Labyrinth
quelle