web-dev-qa-db-ja.com

選択クエリのMySQL IF ELSEIF

ユーザーが選択した数量に基づいて、製品の異なる価格を選択しようとしています。これは私が取り組んでいるクエリです(構文エラーがあります):

 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;
58

ストアドプロシージャで使用したものがあります このように は参照用ですが、現在のように使用することを意図したものではありません。 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は必要ないと思います。

153
nawfal

MySQLのIF()は、3項関数であり、制御構造ではありません。最初の引数の条件が真の場合、2番目の引数を返します。それ以外の場合は、3番目の引数を返します。対応する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)
    )
  )
)

条件はすべて私にとって理にかなっているわけではありません(それらのいくつかは不注意に逆になっているように見えますか?).

15
duskwuff

ネストされたif()関数を使用すると、MySQL 5.1.72にバグが見つかりました。列変数(qty_1など)の値が2番目の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
6
Dave Crooke

ご質問について:

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;

MySQLでif - else制御構造またはIF関数を使用できます。

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

3
user2613580

Nawfalの回答によれば、IFステートメントは手順の中にある必要があります。この投稿は、開発とテスト中にプロシージャでスクリプトを使用する素晴らしい例を示しています。基本的に、プロシージャを作成して呼び出し、ドロップします。

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

2
Warren