• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:状態によって、取得したいデータをかえたい場合のSQLについて)

SQLによる状態別データ取得方法

このQ&Aのポイント
  • 初心者の方に向けて、状態によって変わるデータを取得するSQLの書き方について解説します。状態が1,2,3の場合はデータを取得し、4の場合は取得しないように条件を設定します。
  • みかんTテーブルと状態Tテーブルを結合し、みかんTの状態列と状態Tの状態連番列を照合します。みかんTの状態が1,2,3の場合のみデータを取得し、4の場合は取得しないようにします。
  • 具体的には、SELECT文でみかんTの連番と入荷日を指定し、FROM句でみかんTテーブルを指定します。INNER JOINを使用して、みかんTの状態列と状態Tの状態連番列を照合します。WHERE句でみかんTの状態が1,2,3の場合のみ取得するように条件を指定します。

質問者が選んだベストアンサー

  • ベストアンサー
  • ks0902
  • ベストアンサー率85% (6/7)
回答No.5

>にしますと、状態が1,3の場合は、1のみしか取得できません 「状態が1,3の場合」というのはみかんTに状態が1,3の データしかないという意味ですよね? この条件で「状態が1,3の場合は、1のみしか取得できません」 ということは他に原因があるかもですね。 ちなみに以下のselect文で期待している値は取れますでしょうか? SELECT  連番,  入荷日,  状態  FROM みかん  WHERE   (状態 IN (1,2)) OR   (状態 = 3 AND NOT EXISTS (select * from みかん where 状態 = 4));

akira0628
質問者

お礼

たびたびの御回答ありがとうございます。 WHERE みかん.状態 IN (1,2,3) AND NOT EXISTS ( SELECT * FROM みかん WHERE みかん.状態 IN (4)) 上記の記述で解決できました。 EXISTSを使うこと自体頭になかった(使い方もよくわかっていなかった)ため、 とても勉強になりました。 ありがとうございます(*´∀`*)

その他の回答 (4)

回答No.4

実機確認していませんが、条件式を次のようにしてみては? WHERE (SELECT 状態 FROM みかん WHERE 連番=3)=4 AND 状態<>3 OR (SELECT 状態 FROM みかん WHERE 連番=3)<>4 AND 状態 IN (1,2,3)

akira0628
質問者

補足

御回答ありがとうございます。 記述どおりにしてみますと、 ”サブクエリは複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後に続く場合や、サブクエリが 1 つの式として使われる場合は複数の値は許可されません。” というエラーが出ました。 もう少し、考えてみたいと思います。 ありがとうございます。

  • ks0902
  • ベストアンサー率85% (6/7)
回答No.3

だめでしたか・・・  0 = CASE みかん.状態     WHEN '3' THEN (SELECT COUNT(*) FROM みかん WHERE 状態 = 4)     ELSE 0    END select文  (SELECT COUNT(*) FROM みかん WHERE 状態 = 4) で0がかえってきてないでしょうね。 ちなみに  SELECT isnull(COUNT(*),0) FROM みかん WHERE 状態 = 4 って書換えてもダメでしょうか? ダメなようなら、条件を みかん.状態 IN (1,2) OR (みかん.状態 = 3 AND NOT EXISTS (select * from みかん 状態 = 4)) に変更してみるとどうでしょうか?

akira0628
質問者

補足

再度の御回答ありがとうございます。 SELECT文を >SELECT isnull(COUNT(*),0) FROM みかん WHERE 状態 = 4 にすると、逆に4のデータが取得されてきます。 後記の >みかん.状態 IN (1,2) OR >(みかん.状態 = 3 AND >NOT EXISTS (select * from みかん 状態 = 4)) にしますと、状態が1,3の場合は、1のみしか取得できません(´・ω・`) 再度の御回答なのに、解決できず申し訳ないです。 上記記述も考慮して、考えてみたいと思います。 ありがとうございます!

  • ks0902
  • ベストアンサー率85% (6/7)
回答No.2

sql serverがないので確認しておりませんが  AND  0 = CASE みかん.状態     WHEN '3' THEN (SELECT COUNT(*) FROM みかん WHERE 状態 = 4)     ELSE 0    END または  AND  0 = CASE     WHEN みかん.状態 = '3' THEN (SELECT COUNT(*) FROM みかん WHERE 状態 = 4)     ELSE 0    END のどちらかを条件に追加してください。

akira0628
質問者

お礼

御回答ありがとうございます。 上の条件を試してみましたが、状態4がないのに3が取得できません。。 下の条件はエラーが出ました。 この記述を基盤に色々といじってみようと思います。 ありがとうございます。

akira0628
質問者

補足

すみません、下の条件もエラーは出ませんでした。 しかし、どちらの処理も同じ結果で、 4が含まれている3は取得できないようになっていますが、 4がない場合は3が取得できませんでした。。

  • ks0902
  • ベストアンサー率85% (6/7)
回答No.1

>みかんTの連番3の状態が4の場合、状態3のデータ(みかんTでいう連番2,6)は取得したくありません。 >そうするには、どう書き換えたらうまく動作するでしょうか・・・ この条件は みかんTに状態が4のデータがある場合は状態4、3のデータ以外(状態1、2)を取得する みかんTに状態が4のデータがない場合は全てのデータ(状態1、2、3)を取得する ということでしょうか?

akira0628
質問者

補足

>みかんTに状態が4のデータがある場合は状態4、3のデータ以外(状態1、2)を取得する >みかんTに状態が4のデータがない場合は全てのデータ(状態1、2、3)を取得する その通りです。 説明不足ですみません・・・(汗