- ベストアンサー
1つのフィールドに複数値を設定した場合の抽出方法
ACSESS97を使用しています。 フィールドに複数の値を区切り文字を用いて設定した場合に、SQLを用いて抽出することは可能でしょうか? 注文番号 品物 1 りんご;みかん 2 たまご 3 みかん;たまご この場合、品物に”みかん”が含まれている行を抽出するにはどのような方法があるのか教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
品物に含まれるのが2つ以下限定ならできますね 先ずクエリで品物を2つのフィールドに分けます 前: IIf(InStr([品物],";")<>0,Left([品物],InStr([品物],";")-1)) 後: Mid([品物],InStr([品物],";")+1) 注文番号 品物 前 後 1 りんご;みかん りんご みかん 2 たまご たまご 3 みかん;たまご みかん たまご このクエリからユニオンクエリを作成します SELECT sutonaQ.注文番号, sutonaQ.前 FROM sutonaQ WHERE (((sutonaQ.前) Is Not Null)) union SELECT sutonaQ.注文番号, sutonaQ.後 FROM sutonaQ WHERE (((sutonaQ.後) Is Not Null)) 注文番号 前 1 みかん 1 りんご 2 たまご 3 たまご 3 みかん
その他の回答 (2)
- CHRONOS_0
- ベストアンサー率54% (457/838)
Likeが使えないとなると区切り文字で分解してひとつずつ比較するようなVBAコードを組むしかないですね 当然クエリは使えません、VBAで1レコードずつ処理していくことになります テーブルがデータベースの原則を外しているのですから面倒なことになるのは自業自得です
お礼
回答ありがとうございます。 VBから参照するので、ロジックを組むのは構わないのですが、 実際はフィールドが複数存在し、抽出条件も複数あるため、なるべくSQLで処理を共通化できたら良いなあと思っていた次第です。 Likeで抽出して、抽出したものに問題がないかあとからチェックをかけるのが一番シンプルなのでしょうかね。 クエリ等で複数値をばらせることができる方法があれば、 良いのですが・・・。 注文番号 品物 1 りんご 1 みかん 2 たまご 3 みかん 3 たまご こんな感じに変更できれば、一番良いのですが、 何か方法はないでしょうか。
- ace456
- ベストアンサー率36% (37/102)
以下のSQLを試してみてください -------------- select 注文番号 ,品物 from テーブル名 where 品物 Like "*みかん*" -------------- 補足 欠点は、商品名に「みかんジュース」なんかがあった場合もひっかかることです。 解消するにはテーブルに項目を追加し、 注文番号、注文毎明細番号、品物 などの構成にするとよいでしょう。 SQLで対応できなくもないですが鬱陶しい条件になります。
お礼
回答ありがとうございます。 テーブルの構成と内容は私が決めることができないので、 「みかんジュース」がひっかかるとなるとワイルドカードを使用するのは難しいです。 少々鬱陶しくても確実に「みかん」が含まれている行を取り出したいのですが、何か方法はないでしょうか?
お礼
ありがとうございます。 助かりました。 参考にさせていただきます。