96

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

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

5 に答える 5

239

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

于 2012-12-15T01:06:26.750 に答える
24

IF()MySQLでは、制御構造ではなく三項関数です。最初の引数の条件がtrueの場合、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)
    )
  )
)

条件はすべて私には意味がありませんが(一部が誤って逆になっているように見えますか?)、何を達成しようとしているのかを正確に知らなければ、それを修正するのは困難です。

于 2012-12-14T23:33:28.357 に答える
10

ネストされた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
于 2014-03-04T22:55:48.227 に答える
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;

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

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

于 2017-02-25T12:00:46.977 に答える
2

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

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

于 2016-03-21T22:33:38.073 に答える