10代と話して驚いたこと

いつもお世話になっております。ちょっと困っています。AV資料の管理にAccessを利用していますが、曖昧検索をしたいので、クエリで、

Like "*" & [筆者・監督名は?:] & "*"

で監督名に"黒沢"と入力すると、きちんと表示されますが、あいまい検索の項目を増やすと、例えば、
邦題タイトルとか、同じように

Like "*" & [邦題は?:] & "*"

なんて検索しようとし、ただし、その部分に何も入れないで先程の監督名に"黒沢"と入れると、なぜか、件数が減ってしまいます。原因としては、邦題の部分で何もない場合には何も表示されなくて、邦題と監督名にきちんと入っていれば、監督名検索でHITします。

これをあいまい検索複数で、監督名だけで、全ての件数(邦題が空白でも表示)が表示されるようにするには、クエリ部分でどのように表示させればいいのでしょうか?

分りにくい内容ですが、どなたかお知恵をお貸し下さい。

A 回答 (7件)

ちょっとだけ解説。


ワイルドカードをヘルプで調べると、
「*」は0文字以上の文字列 とあります。
Null は文字列ではないので Like '*' ではヒットしません。

Nz は Null値を置き換える関数です。
Nz([邦題],"") は
IIf(IsNull([邦題]),"",[邦題]) と同じです。

Nz([邦題],"") を Like "*" & [邦題は?:] & "*"
で検索すると、元Nullのものが、"" になっていますから
[邦題は?:] に未入力で全件ヒットになります。

No1さんの
[邦題]を Like "*" & [邦題は?:] & "*" Or Is null
で検索でもよさそうですが、
監督名が未入力で、邦題を入力した場合に
余計なものがヒットしてしまいます。
    • good
    • 0
この回答へのお礼

試行錯誤しながら、どうもNULLの場合の処理がおかしいと気付いたのですが、アクセスは得意ではないので、どのようにかけばいいのか悩んでましたが、どうにかめどが立ちました。

ありがとうございます。今回NZ関数を覚えた事で、NULL値を強制的に""にする事でHITできるなんて、技を教えて頂いて、感謝しております。暫く、そのままにしておりますが、私以外にも参考になったかた多いと思います。大変勉強になりました。ありがとうございます。

お礼日時:2006/08/01 11:12

なるほど、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 "*" & [邦題は?:] & "*"
-------------------------------------------------
    • good
    • 0

邦題タイトルのフィールド名を「邦題」とします。



クエリにフィールドを追加。

フィールド:Nz([邦題],"")
抽出条件: Like "*" & [邦題は?:] & "*"

他の文字列の項目で Nullの可能性があるものは
同じパターンで。

この回答への補足

今までNZでフィールドを追加した事がないのですが、
Nz([邦題],"") と言う項目をフィールに追加するには、どのようにすればいいのでしょうか?
クエリには、現在あるものしか追加した事なくて、
Nz([邦題],"")と言う名前を追加してもエラーになってしまいます。

簡単な操作だとは思うのですが、どうもうまくできません。どのような手順でNz([邦題],"")と言うフィールドを作成できるかご教授くださいませ。

補足日時:2006/08/01 10:42
    • good
    • 0
この回答へのお礼

出来ました。何だか混乱しましたが、
邦題1:Nz([邦題],"")
と入力したら邦題の部分で未入力にしても、"黒沢"と言う文字で検索もきちんとでき、かつ、邦題の部分に適当な文字を入れてもHITするようになりました。

ありがとうございます。
後一息です。ありがとうございました。

お礼日時:2006/08/01 10:53

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("")
----------------------------------
うまく動かないときは、レスいただければ幸いです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ここまで考えていませんでした。
でも折角なので実際に当てはめてみますねぇ。

ここまで考える程の技術はありませんが、折角のご好意使わせて頂きます。

まずはお礼まで、

ありがとうございます。

お礼日時:2006/07/31 20:39

どうやら、条件指定の[邦題は?:]などで何も入力されないでエンターキーを押すと、その値はNullでは無くて、長さ0の文字列""のようです。


なので、テーブルにブランクで入力されているのはNull値なので検索条件に引っかからないようです。

この回答への補足

そのようですねぇ。
NULLを入れるのかどうすればいいのか、思案してましたが、Or NULLにすると見れるようです。
明日、職場で、確かめてみます。検索項目が他にもあるので、その上で改めて御礼を書きたいと思います。

補足日時:2006/07/31 20:35
    • good
    • 0

質問の意味が良く理解できて居ないのかも知れませんが・・・



> Like "*" & [筆者・監督名は?:] & "*"
Like "*" & Nz([筆者・監督名は?:],"") & "*"

> Like "*" & [邦題は?:] & "*"
Like "*" & Nz([邦題は?:],"") & "*"

にしては、どうでしょう?

空白(Null値)の時に、「結果が出ない」、「件数が変らない」のどちらでもなく、「件数が減る」と言う理由が今ひとつ理解できないのですが・・・

And なら「結果が出ない」
Or なら「件数が変らない」

だと、思うのです。

この回答への補足

クエリの中で
Like "*" & [筆者・監督名は?:] & "*"
だけだと22件でるのですが、この他にも抽出項目があり、
Like "*" & [邦題は?:] & "*"
と言う項目も同じ用に設定し、
そこに何も条件を設定しないで通すと、
22件でると思ったら、5件しかHITしなかったんですよねぇ。
邦題の部分で何かしら文字がある場合に抽出されて、そうでない(何もない)場合では、HITしなくて、どうすれば、邦題に何もない場合でも抽出されるのかと思案してました。

NO1さんのお陰で無事思ったような事ができました。

所でこのNzと言うのは何か意味があるのでしょうか?
初めて見る書き方なのですが、教えていただけないでしょうか?お手数おかけしてすみません。

補足日時:2006/07/31 20:25
    • good
    • 0

Like "*" & [邦題は?:] & "*" Or Is null


とか?
    • good
    • 0
この回答へのお礼

ありがとうございました。
この方法で出来ました。
Like "*" & [邦題は?:] & "*" Is null
までは考えたのですが、ORがなくて、
思った事ができなかったんですよねぇ。
どう記述すればよいのか悩んでいましたがありがとうございました。
大変参考になりました。

お礼日時:2006/07/31 20:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A