- ベストアンサー
Accessのクエリで、あいまい検索の方法
いつもお世話になっております。ちょっと困っています。AV資料の管理にAccessを利用していますが、曖昧検索をしたいので、クエリで、 Like "*" & [筆者・監督名は?:] & "*" で監督名に"黒沢"と入力すると、きちんと表示されますが、あいまい検索の項目を増やすと、例えば、 邦題タイトルとか、同じように Like "*" & [邦題は?:] & "*" なんて検索しようとし、ただし、その部分に何も入れないで先程の監督名に"黒沢"と入れると、なぜか、件数が減ってしまいます。原因としては、邦題の部分で何もない場合には何も表示されなくて、邦題と監督名にきちんと入っていれば、監督名検索でHITします。 これをあいまい検索複数で、監督名だけで、全ての件数(邦題が空白でも表示)が表示されるようにするには、クエリ部分でどのように表示させればいいのでしょうか? 分りにくい内容ですが、どなたかお知恵をお貸し下さい。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
ちょっとだけ解説。 ワイルドカードをヘルプで調べると、 「*」は0文字以上の文字列 とあります。 Null は文字列ではないので Like '*' ではヒットしません。 Nz は Null値を置き換える関数です。 Nz([邦題],"") は IIf(IsNull([邦題]),"",[邦題]) と同じです。 Nz([邦題],"") を Like "*" & [邦題は?:] & "*" で検索すると、元Nullのものが、"" になっていますから [邦題は?:] に未入力で全件ヒットになります。 No1さんの [邦題]を Like "*" & [邦題は?:] & "*" Or Is null で検索でもよさそうですが、 監督名が未入力で、邦題を入力した場合に 余計なものがヒットしてしまいます。
その他の回答 (6)
- ape5
- ベストアンサー率57% (85/148)
なるほど、bonaronさんやm3_makiさんのことがただしいですね。 変更するとSQL文が簡単になるのと、前のバグがなおりますね。 ------------------------------------------------- SELECT Authority1,Title1 FROM (SELECT Nz(Authority,"") AS Authority1,Nz(Title,"") AS Title1 FROM ITEM_TBL) WHERE Authority1 Like "*" & [著者・監督名は?:] & "*" AND Title1 Like "*" & [邦題は?:] & "*" -------------------------------------------------
- bonaron
- ベストアンサー率64% (482/745)
邦題タイトルのフィールド名を「邦題」とします。 クエリにフィールドを追加。 フィールド:Nz([邦題],"") 抽出条件: Like "*" & [邦題は?:] & "*" 他の文字列の項目で Nullの可能性があるものは 同じパターンで。
お礼
出来ました。何だか混乱しましたが、 邦題1:Nz([邦題],"") と入力したら邦題の部分で未入力にしても、"黒沢"と言う文字で検索もきちんとでき、かつ、邦題の部分に適当な文字を入れてもHITするようになりました。 ありがとうございます。 後一息です。ありがとうございました。
補足
今までNZでフィールドを追加した事がないのですが、 Nz([邦題],"") と言う項目をフィールに追加するには、どのようにすればいいのでしょうか? クエリには、現在あるものしか追加した事なくて、 Nz([邦題],"")と言う名前を追加してもエラーになってしまいます。 簡単な操作だとは思うのですが、どうもうまくできません。どのような手順でNz([邦題],"")と言うフィールドを作成できるかご教授くださいませ。
- ape5
- ベストアンサー率57% (85/148)
1.筆者・監督名のテーブルでのカラム名をAuthority 2.邦題のカラム名をTitle 3.テーブル名をITEM_TBL とします。 まずVBAで関数を2個作ります。中身は一緒ですがAuthorityとTitleの二つがあるので、2個です。 --------------------------------- 'モジュールレベルの変数を4つ作ります。 Private iCount1 As Integer '何回目の呼び出しかを覚えておくための変数 Private strData1 As String '入力されたデータ保持用 Private iCount2 As Integer Private strData2 As String Function myQuery1(strCondtion As String) As String If strCondtion1 = "**" Then myQuery1 = "" iCount1 = iCount1 + 1 Else If iCount1 = 0 Then myQuery1 = strCondtion1 strData = strCondtion1 iCount1 = iCount1 + 1 Else iCount1 = 0 myQuery1 = strData End If End If End Function ' Function myQuery2(strCondtion As String) As String If strCondtion2 = "**" Then myQuery2 = "" iCount2 = iCount2 + 1 Else If iCount2 = 0 Then myQuery2 = strCondtion2 strData = strCondtion2 iCount2 = iCount2 + 1 Else iCount2 = 0 myQuery2 = strData End If End If End Function --------------------------------- ここまでできたら後はSQL文です。 考え方としてはNullのデータもまず取り出し、その後Nullを""の0文字列に変更してあいまい検索にかけます。 SQL文----------------------------- SELECT Authority1,Title1 FROM ( SELECT IIF(Authority IS Null,"",Authority) AS Authority1,IIF(Title IS Null,"",Title) AS Title1 FROM ITEM_TBL WHERE (Authority Like myQuery1("*" & [筆者・監督名は?:] & "*") OR Authority IS Null) AND (Title Like myQuery2("*" & [邦題は?:] & "*") OR Title IS Null)) WHERE Authority Like myQuery1("") AND Title Like myQuery2("") ---------------------------------- うまく動かないときは、レスいただければ幸いです。
お礼
ありがとうございます。 ここまで考えていませんでした。 でも折角なので実際に当てはめてみますねぇ。 ここまで考える程の技術はありませんが、折角のご好意使わせて頂きます。 まずはお礼まで、 ありがとうございます。
- ape5
- ベストアンサー率57% (85/148)
どうやら、条件指定の[邦題は?:]などで何も入力されないでエンターキーを押すと、その値はNullでは無くて、長さ0の文字列""のようです。 なので、テーブルにブランクで入力されているのはNull値なので検索条件に引っかからないようです。
補足
そのようですねぇ。 NULLを入れるのかどうすればいいのか、思案してましたが、Or NULLにすると見れるようです。 明日、職場で、確かめてみます。検索項目が他にもあるので、その上で改めて御礼を書きたいと思います。
- Dxak
- ベストアンサー率34% (510/1465)
質問の意味が良く理解できて居ないのかも知れませんが・・・ > Like "*" & [筆者・監督名は?:] & "*" Like "*" & Nz([筆者・監督名は?:],"") & "*" > Like "*" & [邦題は?:] & "*" Like "*" & Nz([邦題は?:],"") & "*" にしては、どうでしょう? 空白(Null値)の時に、「結果が出ない」、「件数が変らない」のどちらでもなく、「件数が減る」と言う理由が今ひとつ理解できないのですが・・・ And なら「結果が出ない」 Or なら「件数が変らない」 だと、思うのです。
補足
クエリの中で Like "*" & [筆者・監督名は?:] & "*" だけだと22件でるのですが、この他にも抽出項目があり、 Like "*" & [邦題は?:] & "*" と言う項目も同じ用に設定し、 そこに何も条件を設定しないで通すと、 22件でると思ったら、5件しかHITしなかったんですよねぇ。 邦題の部分で何かしら文字がある場合に抽出されて、そうでない(何もない)場合では、HITしなくて、どうすれば、邦題に何もない場合でも抽出されるのかと思案してました。 NO1さんのお陰で無事思ったような事ができました。 所でこのNzと言うのは何か意味があるのでしょうか? 初めて見る書き方なのですが、教えていただけないでしょうか?お手数おかけしてすみません。
- nicotinism
- ベストアンサー率70% (1019/1452)
Like "*" & [邦題は?:] & "*" Or Is null とか?
お礼
ありがとうございました。 この方法で出来ました。 Like "*" & [邦題は?:] & "*" Is null までは考えたのですが、ORがなくて、 思った事ができなかったんですよねぇ。 どう記述すればよいのか悩んでいましたがありがとうございました。 大変参考になりました。
お礼
試行錯誤しながら、どうもNULLの場合の処理がおかしいと気付いたのですが、アクセスは得意ではないので、どのようにかけばいいのか悩んでましたが、どうにかめどが立ちました。 ありがとうございます。今回NZ関数を覚えた事で、NULL値を強制的に""にする事でHITできるなんて、技を教えて頂いて、感謝しております。暫く、そのままにしておりますが、私以外にも参考になったかた多いと思います。大変勉強になりました。ありがとうございます。