• ベストアンサー

select文のwhere句に配列を入れて検索したいのです。

はじめまして。php5とpostgresを使って、ブラウザで都道府県をセレクトで複数選択(prefecture[])して、postgresに select city from city_table where p_id='prefecture'; としているのですが、結果を出力できません。 print_rで見たところprefectureに複数選択した都道府県のidが配列として入っていることは確認しております。 where句に配列を入れて検索するにはどうすれば良いのでしょうか? よろしくお願いいたします。

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

  • ベストアンサー
  • Kazamin
  • ベストアンサー率30% (17/56)
回答No.1

WHERE句の書き方が違うと思います。 複数の条件であれば = ではなく、IN を使います。   WHERE p_id IN (条件1, 条件2, …)

kappa_chan
質問者

補足

ご回答ありがとうございます。 さっそく試してみたのですが、やはりselectしません。 ちなみにp_idを配列(p_id[])ではなく、要素(p_id)としてhtmlで受け取るとselectします。 どうもwhere p_id =ではなくwhere p_id INとしても配列の中の要素が取り出されてないように感じるのですが。。。 phpでforeachとかarray_mapなども使ってみてるのですが、うまくいかない状況です(泣

その他の回答 (3)

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.4

まあ、SQLでやるならの例を示しましたが、No3さんの指摘どおり複数選択(prefecture[])したSQLが複雑で、SQLが長くなる、1行じゃどうにもならない(prefecture[]の作り方によります。)等の弊害があるのであれば、prefectureした結果を配列に格納してそれを元に動的SQLを作成する方法は有ります。 ケースバイケースですね。

kappa_chan
質問者

補足

動的SQLをググってみました。 書店に行って記述のある本も探してみましたが・・・ 私には難しすぎます(泣 難度の高すぎることをしようとしているのでしょうか。。。

回答No.3

DB上は単純な構造(配列でない)の列で、アプリケーション中は配列ということですよね? 複数のRDBMSの使用経験があり、いくつかのRDBMSでは専門的な知識を持っていますが、アプリケーション中の配列の各要素を取り出して、DB上の列と条件を評価するといったことをサポートしているRDBMSは、私の知る限りは存在しませんが?

kappa_chan
質問者

補足

アドバイスありがとうございます。 例えば、カーセンサー(http://www.carsensor.net/)を見ると車のタイプ・特徴から選ぶでname="BLST[]"に複数のvalueが渡されています。 配列の中の要素を取り出してselectする方法なら可能のように思えるのです。 追記 作りたいアプリケーションは不動産情報(http://www.athome.co.jp/Haht_atweb/hsrun.exe/atweb2/athomeweb/athomeweb.htx;start=HS_Bk_Cond_Area_Search?gid=bk&ken=13&category=kr&srcby=area®ion=30&HomenList=01)のようなものです。

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.2
kappa_chan
質問者

補足

参考になるサイトのご紹介ありがとうございます。 早速、勉強させていただきます。

関連するQ&A

  • select文のwhere句に配列を入れて検索したい

    こんばんは。 題名の通り、select文のwhere句に配列を入れて検索したいのですが、 同じ質問↓も見つけ、やってはみるのですがうまくいかないので、教えてください。 http://oshiete1.goo.ne.jp/qa2940474.html 現在、 $member_id という配列にデータを入れ(この配列には正しく値が入っています。) $sql = "SELECT * FROM テーブル名 WHERE id IN (".$member_id."); としているのですが、うまくいきません。 どこがおかしいのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • もうちょっと賢いSELECT文が書けないものでしょうか

    初めまして、最近SQLをかじり始めたぺーぺーです。 効率の悪いSELECT文しか書けずに困っています。 下記のテーブルsoftware_tableから、 ・name列「oracle」 ・version値が最大 のレコードに含まれるid(=3)を拾ってきたいのですが、自分の頭では副問い合わせを使う方法か、ソートを使う方法しか思いつきません。 問題は副問い合わせ・ソートを使うと計算コストが大きくなってしまうことで、できることなら副問い合わせ・ソートを使わずに解決したいのですが、何か方法はないものでしょうか? よろしくお願い致します。 ----------------------------- software_table id name version 1 oracle 1 2 oracle 2 3 oracle 3 4 postgres 1 5 postgres 2 6 postgres 3 7 postgres 4 ----------------------------- ■副問い合わせを使った方法 SELECT id FROM software_table WHERE name = 'oracle' AND version = (SELECT max(version) FROM software_table WHERE name = 'oracle'); ■ソートを使った例 SELECT id FROM software_table WHERE name = 'oracle' ORDER BY version DESC LIMIT 1 OFFSET 0; -----------------------------

  • SELECT文の二段重ね

    次のSQL文を実行します。 create table1 (id, english) insert table1 (1,"foo") insert table1 (2,"bar") create table2 (id, japanese) insert table2 (1, "ふー") insert table2 (2, "ばー") SQL文法としては誤ってますが、成功したとします。 いま、select id from table1 where english = 'foo'; で1が得られます。 いま、select japanese from table2 where id = 1; で"ふー"が得られます。 これを一つのSQLite3のselect文で実現できないでしょうか。 select japanese from table2 where id = (select id from table1 where english = 'foo'); で良いですか? カテゴリ選択にSQLiteが無いのは、人気が無いからですかね。

  • ORACLEでwhere句の検索順序

    Oracle9i windows2000です。 以下のようなテーブルがあります。 table_a ----------------------- id   NUMBER(10,0) NOT NULL, sort   NUMBER(10,0) NOT NULL, name   VARCHAR(10), text   VARCHAR(255) この条件で、以下のふたつのSELECT文を発行した時、パフォーマンスが良いのはどちらですか? Oracleでは後ろから検索されると聞いたことがあるのですが本当でしょうか? ※idにプライマリキー、 id,sortにインデックスが貼ってあります。 (1)SELECT text FROM table_a WHERE id = 1 AND sort = 2 AND name = 'a' (2)SELECT text FROM table_a WHERE name = 'a' AND sort = 2 AND id = 1

  • 「SELECT ~  FROM テーブル名」の後に続く句は「WHERE句」と「ORDER BY句」以外にありますか?

    最近アクセスのSQL文を学びました。 選択クエリのSQL文で 「SELECT ~  FROM テーブル名」 の後に続く句は 「WHERE句」と 「ORDER BY句」以外にありますか? よろしくお願いします。

  • MySQLのselect文の設定に関して

    MySQLのselect文で、IDを例えば10001~10010までを検索する場合はどうすればいいのか教えて頂けないでしょうか? select * from table_A where ???

    • ベストアンサー
    • MySQL
  • SQL文のselect文でwhereが使えない。

    皆様始めまして~初歩的な質問かもしれないですが postgresSQLのデータをpsqlコマンドでみるときに whereをつかわずに [xxxxxxx@yyyyyy ~]$ psql -q -c 'select * from employ_kanri' xxxxxx postgres 社員名 | 社員番号 | 勤務先 ------------------------+--------------+---------------------------- 田中 | 200700 | 横浜 と結果はでるのに、 whereを使うと [xxxxxxxx@yyyyy ~]$ psql -q -c 'select * from employ_kanri where 勤務先 = '横浜'' xxxxxx postgres ERROR: column "横浜" does not exist になるのはなぜでしょうか? ちなみにデータベースに入ってwhereコマンドを使うと問題なくできます。。 [xxxxxxx@yyyyyyy ~]$ psql xxxxxx postgres Welcome to psql 7.4.11, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help on internal slash commands \g or terminate with semicolon to execute query \q to quit xxxxxxx=# select * from employ_kanri where 勤務先 = '横浜'; 社員名 | 社員番号 | 勤務先 ------------------------+--------------+---------------------------- 田中 | 200700 | 横浜 よろしくお願いします

  • Oracle SQLの、where句内の条件文について教えてください。

    Oracle SQLの、where句内の条件文について教えてください。 下記SQLの(1)と(2)の記述文を教えてください。 (1)例:owner = sys,admin ownerがsysまたは、adminを抽出 (2)例:column_name = '*aaa*' column_nameに「aaa」が含まれているデータ SELECT owner, table_name,column_name FROM all_tab_columns WHERE (1)(Ownerを複数指定)   and (2)(column_nameに、●●が含まれるデータ)

  • MySQL WHERE句のLIKE検索

    初心者ですみません。 MySQL WHERE句のLIKE検索で、引っかかった文字列を 除いた項目を表示させるにはどうしたらいいでしょうか。 例えば、 SELECT * from [テーブル名] where [フィールド名] like '%あ%'; として、「あ」が入っているレコードを検索し、 該当しないレコードを表示させる。 どうか教えてください。よろしくお願いします。

  • where条件内のin句について

    質問です。 where code in(select code from list where ....) ------------------------------------------ といったwhere句がある場合ですが、 in句でヒットしている件数が5000件を超えているため SQLを発行してもタイムアウトでエラーになります。 何か回避策はないでしょうか? よろしくお願いします。