• ベストアンサー
  • 困ってます

SQLの条件検索について

下記のような「果物TBL」というテーブルがあるとします。 果物TBL -------------------------------- ID    名前      値段 - - - - - - - - - - - - - - - - - - - - 01    りんご     150 02    バナナ     250 03    みかん     250 04    ぶどう     300 -------------------------------- また上記のテーブルと全く同じ構成の「果物検索TBL」というテーブルがあるとします。 そのテーブルには、例として下記のような値を入れておきます。 果物検索TBL -------------------------------- ID    名前      値段 - - - - - - - - - - - - - - - - - - - - NULL   りんご     250 NULL   バナナ     NULL -------------------------------- この時、下記のようなSQLだと SELECT DISTINCT 果物TBL.名前 FROM 果物TBL INNER JOIN 果物検索TBL ON (果物TBL.ID = 果物検索TBL.ID AND LEN(果物検索TBL.ID) > 0) OR (果物TBL.名前 = 果物検索TBL.名前 AND LEN(果物検索TBL.名前) > 0) OR (果物TBL.値段 = 果物検索TBL.値段 AND LEN(果物検索TBL.値段) > 0); -------------------------------- 名前 - - - - - - - - - - - - - - - - - - - - バナナ みかん りんご -------------------------------- という結果になります。(名前:りんご・バナナと値段:250のOR検索) その結果を -------------------------------- 名前 - - - - - - - - - - - - - - - - - - - - バナナ -------------------------------- という結果にするにはどうすればいいでしょうか?(名前:りんご・バナナと値段:250のAND検索、バナナのみマッチ) 単純にORをANDにしてもうまくいきませんでした。 動的にSQLを作れれば良いのですが、この構成は変えられないのでNULL値がネックになり分かりません。 教えてください。 また、記載してるSQLよりもっとスマートな書き方があれば教えてください。

共感・応援の気持ちを伝えよう!

  • 回答数7
  • 閲覧数201
  • ありがとう数8

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

  • ベストアンサー
  • 回答No.7

なんどもすみません(汗)。 ANo.6 ですが、FROM を FORM とタイプミスしています。 SELECT DISTINCT 果物TBL.* FROM 果物TBL WHERE (ID In (SELECT ID FROM 果物検索TBL) AND EXISTS (SELECT 1 FROM 果物検索TBL WHERE ID Is Not Null)) AND (名前 In (SELECT 名前 FROM 果物検索TBL) AND EXISTS (SELECT 1 FROM 果物検索TBL WHERE 名前 Is Not Null)) AND (値段 In (SELECT 値段 FROM 果物検索TBL) AND EXISTS (SELECT 1 FROM 果物検索TBL WHERE 値段 Is Not Null));

共感・感謝の気持ちを伝えよう!

質問者からのお礼

何度もありがとうございます。 なんとなくIIFが分かりました。 こっちの書き方のほうがわかりやすいですが、見た目はIIFを使ったほうがスマートですね。 (実行速度に差はあるのかな?) どうもありがとうございました。

関連するQ&A

  • PHP SQL 問合せについて

    SQLについて質問いたします。SQL 全般でも結構です。 No,name 1,ばなな 2,りんご 3,ばなな 4,みかん 5,ばなな 6,りんご 上記テーブルで 1,ばなな 3,ばなな 5,ばなな 2,りんご 6,りんご 4,みかん の結果を得るSQLはどのように記述すればよいでしょうか?

  • PHP SQL 問合せについて

    PHP SQL 問合せについて http://okwave.jp/qa/q7689206.html での質問の続きとなります。 No,name 1,ばなな 2,りんご 3,ばなな 4,みかん 5,ばなな 6,りんご 上記テーブルで 1,ばなな 3,ばなな 5,ばなな 2,りんご 6,りんご 4,みかん の結果を得るSQLはどのように記述すればよいでしょうか? 回答 select * from tableA x order by (select count(*) from tableA y where y.name = x.name ) ,No で解決していますが、 select * from tableA x where name ='果物' とした場合、結果が異なります。 (結果が多い順にならない) 出現回数が多い順に並べるには、どのような記述になりますか? データには「果物以外のデータが含まれている」とします。 宜しくお願い致します。

    • 締切済み
    • PHP
  • 条件が複数行にわたる検索

    下のようなテーブル構成の場合に、[tbl1_tbl2テーブル]の検索で 「tbl2_idカラムが1と2両方を保持する行のtbl1_id」を取得(この場合だと1と3を取得)したい のですが、どのようにSQLを記述すれば良いのでしょうか? [tbl1テーブル] id 1 2 3 [tbl2テーブル] id 1 2 3 [tbl1_tbl2テーブル] tbl1_id tbl2_id 1     1 1     2 3     1 3     2 2     1

    • ベストアンサー
    • MySQL

その他の回答 (6)

  • 回答No.6

ANo.5 もたぶん間違ってます。 ANo.4 さんの回答が正しいと思います。 考え方は同じですが、別の書き方をすると、 SELECT DISTINCT 果物TBL.* FROM 果物TBL WHERE (ID In (SELECT ID FORM 果物検索TBL) AND EXISTS (SELECT 1 FORM 果物検索TBL WHERE ID Is Not Null)) AND (名前 In (SELECT 名前 FORM 果物検索TBL) AND EXISTS (SELECT 1 FORM 果物検索TBL WHERE 名前 Is Not Null)) AND (値段 In (SELECT 値段 FORM 果物検索TBL) AND EXISTS (SELECT 1 FORM 果物検索TBL WHERE 値段 Is Not Null));

共感・感謝の気持ちを伝えよう!

  • 回答No.5

#3ですが勘違いしてました。無視してください。 (ID すべて)かつ(名前が りんご、または、バナナ)かつ(値段 が 250円)というような条件にしたいということなら、 下記でいいかな。 SELECT DISTINCT 果物TBL.* FROM 果物TBL, 果物検索TBL WHERE (果物TBL.ID = 果物検索TBL.ID OR 果物検索TBL.ID Is Null) AND (果物TBL.名前 = 果物検索TBL.名前 OR 果物検索TBL.名前 Is Null) AND (果物TBL.値段 = 果物検索TBL.値段 OR 果物検索TBL.値段 Is Null);

共感・感謝の気持ちを伝えよう!

質問者からのお礼

偶然、No.3にお礼を書いている時にご回答して下さったようですね^^ 再度ご回答ありがとうございます。 果物TBLでは望みどおりの結果が出ました。 今度は実際のテーブルに置き換えて試してみます。 ありがとうございました。

  • 回答No.4

ACCESS で確認したものになりますが、 ★★ が 果物TBL、 ■■ が 果物検索TBL とします。 ■■ には NULL ではないものが必ず1つはある、という条件にて OR検索 SELECT DISTINCT 名前 FROM ★★ WHERE IIF(EXISTS (SELECT 1 FROM ■■ WHERE ID IS NOT NULL), ID IN (SELECT ID FROM ■■), False) OR IIF(EXISTS (SELECT 1 FROM ■■ WHERE 名前 IS NOT NULL), 名前 IN (SELECT 名前 FROM ■■), False) OR IIF(EXISTS (SELECT 1 FROM ■■ WHERE 値段 IS NOT NULL), 値段 IN (SELECT 値段 FROM ■■), False); また OR なら以下でも良いですね:上記は AND と書き方合わせるという事で SELECT DISTINCT 名前 FROM ★★ WHERE ID IN (SELECT ID FROM ■■) OR 名前 IN (SELECT 名前 FROM ■■) OR 値段 IN (SELECT 値段 FROM ■■); なお、提示された SQL で、AND LEN(・・・)>0 の部分は、いらないような気がします。 ( NULL とは結合できなかったと思うので) AND検索 SELECT DISTINCT 名前 FROM ★★ WHERE IIF(EXISTS (SELECT 1 FROM ■■ WHERE ID IS NOT NULL), ID IN (SELECT ID FROM ■■), True) AND IIF(EXISTS (SELECT 1 FROM ■■ WHERE 名前 IS NOT NULL), 名前 IN (SELECT 名前 FROM ■■), True) AND IIF(EXISTS (SELECT 1 FROM ■■ WHERE 値段 IS NOT NULL), 値段 IN (SELECT 値段 FROM ■■), True); でどうでしょう。 処理性能についてはわかりません。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご提示頂いたSQLで望みどおりの結果が出ました。 IIFというのがイマイチなんなのかわからないので、SQLの中身はまだ理解できていませんが・・・ 調べてみます。 ただNo.1のお礼に書いたのと同様に、実際に使用するテーブルにて実行すると式が複雑と怒られました。 やはり、条件を減らすしか無いのかもしれません。 どうもありがとうございました。

  • 回答No.3

データベースはAccessでしょうか。 Null同士も一致と見なしたいのだと解釈しましたがどうでしょうか。。 Nullは = で比較できないので、変換して比較します。 AccessならNz関数で変換できます。 SELECT DISTINCT 果物TBL.名前 FROM 果物TBL INNER JOIN 果物検索TBL ON (Nz(果物TBL.ID,"") = Nz(果物検索TBL.ID,"")) AND (Nz(果物TBL.名前,"") = Nz(果物検索TBL.名前,"")) AND (Nz(果物TBL.値段,"") = Nz(果物検索TBL.値段,""));

共感・感謝の気持ちを伝えよう!

質問者からのお礼

Accessを使用しております。 ご提示頂いたSQLではうまくいきませんでした。 ただNzという関数は知らなかったので、勉強になります。 どうもありがとうございました。

  • 回答No.2

下記でしょうか? IDはユニークのはずなのでIDの一致で抽出 名前+値段でたぶんユニークになるのでそれぞれの一致で抽出 --- SELECT DISTINCT 果物TBL.名前 FROM 果物TBL INNER JOIN 果物検索TBL ON (果物TBL.ID = 果物検索TBL.ID) OR (果物TBL.名前 = 果物検索TBL.名前 AND 果物TBL.値段 = 果物検索TBL.値段);

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご提示いただいたSQLですと、結果が0件になってしまいます(泣) どっちにしてもNo.1のお礼欄に書いた通り実際にはカラムが多いので、 この書き方ですととても複雑になってしまいそうです。 (最初に一言言っておけばよかったですね。失礼しました。) ご回答いただきどうもありがとうございました。

  • 回答No.1

なかなかクレバーなSQLで、実用以上に複雑な構文になっているかもしれませんね。 一つ目は、こんな式が思いつきました。 SELECT distinct 果物TBL.名前 FROM 果物TBL WHERE ([果物TBL].[名前]) in (SELECT 名前 FROM 果物検索TBL) OR ([果物TBL].[値段]) in (SELECT 値段 FROM 果物検索TBL) 次の検索条件は、りんごとバナナを最初にセレクトして、かつ250円ということですが、 検索TBLで「りんご     250」となっているのが、非常に扱いづらいというか、これは250円のりんごはリストにありますか という解釈になってしまいます。答えはなしです。 たぶん、検索データが入ったテーブル構造を練り直す必要があると思います。 あえて、検索TBLのお互いのフィールドはまったく無関係である、としゃにむに解釈しますと SELECT distinct 果物TBL.名前 FROM 果物TBL WHERE ([果物TBL].[名前]) in (SELECT 名前 FROM 果物検索TBL) AND ([果物TBL].[値段]) in (SELECT 値段 FROM 果物検索TBL) OR を ANDに変えるだけになります。 解釈合ってますでしょうか。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

記述頂いた内容にて望み通りの結果が出ました。 ただ、今回のテーブルは質問用にカラムを減らしましたが、 実際のテーブルはカラムが多く、このSQLを実行しましたところ、 式が複雑すぎますと怒られてしまいました。 条件を減らす等で対処しようかと思います。 どうもありがとうございました。

関連するQ&A

  • SQLのsum関数

    こんにちは。 PostgresのSQLが思うように動いてくれません!! そのIDを持っている人がどのくらいの数を持っているのかを抽出したいのです。 テーブルは下記です。 ********************************************* ★Aテーブル ID  名前  数  場所  日付 0001 みかん 1  冷蔵庫 0901 0001 みかん 4  倉庫  0901 0001 みかん 1  冷蔵庫 0901 0002 いちご 1  部屋  0901 0002 いちご 2  部屋  0801 0003 きのこ 6  倉庫  0901 ★Bテーブル ID  名前 0001 みかん 0002 いちご 0003 きのこ 0004 あいす ********************************************* となっている場合、下記SQLを実行すると select a.ID ,b.名前 ,sum(a.数) as 数 from Aテーブル a,Bテーブル b where a.日付 >= '0901' and a.日付 <= '0901' and a.ID = b.ID group by a.ID ,b.名前, a.数 結果が 0001 みかん 2 0001 みかん 4 0002 いちご 1 0002 いちご 2 となり0001は合計6で出て欲しいのに別々に出てしまいます。 理想では 0001 みかん 6 0002 いちご 3 で出て欲しいです。 たとえばこの場合、場所によってなど出てしまうものでしょうか? これはなぜなのでしょうか? よろしくお願いします。

  • アクセス 複数条件でフィルタをかけたい

    アクセス2007です。 テーブル1のフィールド1には りんご みかん バナナ と入力しました。 そして右クリックでフィルタをかけたいのですが条件は りんご or みかんです。 図のように「りんご or みかん」としてみましたが できませんでした。 この場合、バナナを含まない、バナナに等しくないを選択すればいい事はわかっていますが 実際のデータはたくさんの種類のデータがあり、消去法では対応できません。 アドバイスよろしくお願いします。

  • SQLを教えてください

    毎月月末に、当月分のtbl_orderのデータを tbl_order_oldに移す作業を手動で行っているのですが、 SQL一回もしくは、二回で出来ないしょうか tbl_order_oldテーブルはtbl_orderテーブルと全く同じ構造になっています。 tbl_order itemname orderday りんご 2015/11/1 みかん 2015/11/2 もも 2015/11/30 かき 2015/12/1 いちご 2015/12/2 (1)tbl_order_oldにorderdayが2015/11/1~2015/11/30までのデータを追加 (2)tbl_orderからorderdayが2015/11/1~2015/11/30までのデータを削除

    • ベストアンサー
    • MySQL
  • 場合によって条件を変えるSQL

    ORACLE環境下、SQLにて以下のような条件でデータを取得したいです。 AテーブルとBテーブルを結合して、Bテーブルから名称を取得する。 <Aテーブル> id (key) 番号1 番号2 A01  001  n0001 A02  null  n0002 <Bテーブル> code(key) 名前  番号1 番号2 c0001   太郎  001  n0001 c0002   次郎  002  n0002 (1)A.番号が入力されていれば A.番号1=B.番号1 AND A.番号2=B.番号2を条件にする (2)A.番号が入力されていなければ A.番号=B.番号を条件からはずす。 A.番号2=B.番号2 のみで検索する。 <欲しい結果> A01→太郎を取得 A02→次郎を取得 入力されていたら条件に加え、入力されていなかったら 条件から外す、というSQLを教えていただけないでしょうか。 よろしくお願いいたします。

  • 複数検索時の条件分岐について

    環境:php5、mysql5 条件検索はできるのですが検索状況の違いによる条件分岐について どなたがアドバイスをお願いします。 $sql内でWHERE以降を「 if ~ else ~ 」などを使って変更するか WHILE以降を変更する気がするのですがやり方がよくわかりません。 よろしくお願いします。 以下設定 テーブル  :tbl_item [int] フィールド1:item_id [int] フィールド2:cate_id [int] ←他テーブル(名前に変換) フィールド3:item_name [varchar] フィールド4:price [decimal] フィールド5:stock_id [int]   ←他テーブル 条件1:cate_id(プルダウン)を検索条件に加えている時 $sql = "SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id WHERE tbl_item.cate_id = '" . mysql_real_escape_string( $_GET['cate_id'] ) . "' AND tbl_item.item_name LIKE '%" . mysql_real_escape_string( $_GET['item_name'] ) . "%' AND price BETWEEN '" . mysql_real_escape_string( $_GET['price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['price_e'] ) . "' ORDER BY tbl_item.item_id desk LIMIT ${_GET['page']}, ${_GET['rows']} "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); 条件2:cate_id(プルダウン)を検索条件に加えていない時 $sql = "SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id WHERE tbl_item.item_name LIKE '%" . mysql_real_escape_string( $_GET['item_name'] ) . "%' AND price BETWEEN '" . mysql_real_escape_string( $_GET['price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['price_e'] ) . "' ORDER BY tbl_item.item_id desk LIMIT ${_GET['page']}, ${_GET['rows']} "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ・ ・ アイテム数 <?= $num_rows ?> 種類 ・ ・ <? WHILE ( $item = mysql_fetch_array( $result ) ) { ?> ・ ・ ・ <? $n ++; } ?>

    • ベストアンサー
    • PHP
  • 「Or検索」をするには?

    グーグルやヤフーのようにアクセスのフォーム上からクエリの検索も「Or検索」をしたいのですがやり方がわかりません。 (長くなりますがお付き合いくださいませ(*_ _)ペコリ) ******************************************************* テーブル1 フィールド名:果物 りんご みかん ******************************************************* クエリ1 SELECT テーブル1.果物 FROM テーブル1 WHERE (((テーブル1.果物) Like "*" & [Forms]![フォーム1]![テキスト1] & "*")); ******************************************************* フォーム1 テキスト1とコマンド0を配置。 コマンド0のイベントに Private Sub コマンド0_Click() DoCmd.OpenQuery "クエリ1" End Sub ******************************************************* と作りました。 これで、テキスト1に「み」と入力し、コマンド0を押せば クエリ1は「みかん」が表示され、 「ん」と入力すれば、 「りんご」「みかん」のどちらも表示されます。 今からやりたいことは 「りんご」「みかん」のどちらも入力して どちらも表示させたいのです。 (こちらのサイトもそのような仕組みですよね?) 多分、 WHERE (((テーブル1.果物) Like "*" & [Forms]![フォーム1]![テキスト1] & "*")) の部分をどうにかするのだと思うのですが わかりません。 どなたかご教授いただけないでしょうか? イメージとして画像をUPします。 よろしくお願いします。

  • 行数をカウントするSQLにつきまして

    行数をカウントするSQLにつきまして いつもお世話になっております。 下記の売上テーブルから りんご=3(行) みかん=2(行) メロン=1(行) というようなデータを抽出するSQLはどのように記述したら良いのでしょうか? ・・・・売上テーブル・・・ 売上番号 品名 単価 1     りんご 100 2     りんご 100 3     りんご 100 4     みかん 150 5     みかん 150 6     メロン 250

  • SQLで乱数を使った取得の工夫

    お世話になります。 ID,name,point 1.りんご.30 2.みかん.22 3.いちご.18 4.バナナ.13 5.すもも.4 6.マンゴー.1 上記のようなデータがある場合、pointが高いほど 選ばれ易くするようなSQLを記述したいのですが、 その方法をお教えいただけないでしょうか。 ただのランダムであれば、『SELECT * FROM テーブル名 WHERE ID=abs(random()%全レコード数(この場合は6)+1』と すれば、均等にランダムで拾えますが、これを1のりんごのIDほど 取得しやすく、6のマンゴーほど発生しにくくするといった感じです。 以上、よろしくお願いいたします。

  • 複数の検索条件の合計

    複数の検索条件がある場合の結果の合計を求める関数を教えてください。 例えばA列にりんご・みかん・ばなな・りんご・りんごがあり B列に値段(100円・200円・100円・150円・100円) C列に個数(3・2・2・3・1)があるような場合で りんごの中で100円で販売した個数の合計(この場合4)、というような。 説明が雑ですがよろしくお願いします。

  • データの全項目比較について

    いいやり方があれば、おしえてください。 テーブルA************** みかん おいしい 100個 静岡産 りんご 赤い   20個 青森産 きゃべつ 春物  10個 北海道産 テーブルB************* みかん まずい 30個 静岡産 りんご 赤い  20個 新潟産 このような二つのテーブルがあるとして、 検索によって、Aテーブルにないもの(きゃべつ)と、 さらにAテーブルとBテーブルの品物名は同じだけど、産地や個数や味評価がことなるものを取り出すSQL構文はありませんか? (紐付けは品物名でします) 希望する結果はこうです。 結果**** みかん おいしい まずい 100個 30個  NULL(等しいので) NULL りんご NULL  NULL NULL  NULL 青森産 新潟産 きゃべつ NULL 春物 NULL 10個 NULL 北海道産 NULL ちなみに、対象の項目は、本当は100個ほどあるのですが・・・。 どうぞよろしくお願いします。

    • ベストアンサー
    • MySQL