Microsoft Access 掲示板

複数のlike をスマートにしたい

15 コメント
views
4 フォロー

クエリの抽出条件で、not like "*○○*" and not like "*○○*" and ・・・と沢山の○○を非表示にしていますが、スマートな書き方は出来ないでしょうか?not like を1回だけ書く方法等有りましたらご教授ください。宜しくお願い致します。

jam
作成: 2019/06/04 (火) 00:13:39
通報 ...
1
hatena 2019/06/04 (火) 11:18:03 修正

非表示の対象が大量にあるのなら、「非表示リスト」テーブルを作成してそれを利用するといいでしょう。

禁止ワードリスト

禁止ワード
○○
△△
□□
◆◆

クエリのフィールド欄に下記の式を設定。

式1: DLookup("禁止ワード","禁止ワードリスト","'" & [対象フィールド] & "' Like '*' & [禁止ワード] & '*'" )

抽出条件欄には、下記を設定。

Is Null

禁止ワードの追加や変更があった場合、禁止ワードリストを変更するだけですみます。

2

ご回答誠に有難うございます。大量にあるわけでは、無いのです。AND では無く ORの場合は、
Like "[○,○,・・・]"があり、ANDでもこの様な事が出来ないかなと思いまして。見易さ、編集のし易さを考えています。テーブルを作らない方法をお願い致します。

5

*で囲まれた範囲は、フォントを斜体にするいう意味になりますので、
そのようなコードや式を記述する場合は、バッククォート ` で囲んでください。
バッククォートは、Shift+@ で入力できます。

`Like "[○,○,・・・]"`

3
hatena 2019/06/04 (火) 13:34:50 修正

Like "*[ABC]*" は、一文字単位で、AまたはBまたはCを含むものという意味ですがそれでいいのでしょう。
分解すると、下記の意味になります。
Like "*A*" OR Like "*B*" OR Like "*C*"

一文字単位でいいなら、
Like "*[!ABC]*"
とすれば、A, B, C のすべてを含まないものという条件になります。分解すると、
Not Like "*A*" AND Not Like "*B*" AND Not Like "*C*"
となります。

4

ご回答有難うございます。Not Like "*A*" AND Not Like "*B*" AND Not Like "*C*" で現在複数文字の曖昧抽出を行なっていますが、複数文字列の場合でnot like  "*○○*" AND ・・・をコンパクトに行いたいと思っています。Not Like "A" AND Not Like "B" AND Not Like "C"が複数文字列である場合の分解しない状態をご教授願えないでしょうか。宜しくお願い致します。

6

Like "*[!ABC]*" ではだめなら、Like演算子のみでは無理です。

上の回答の方法か、VBAで自作関数を作成することになります。

禁止ワードテーブルを作成したほうが、ワードの編集、追加は楽だと思います。
複数のクエリで使用する場合も一か所の編集で済みます。

7

色々ご教示頂き有難う御座いました。テーブル試しに作ってやってみます。有難う御座いました。

8
名前なし 2019/06/04 (火) 14:58:11 1a3c7@f966d

やっぱりクエリでやろうとすることがスマートじゃないんじゃないかなぁと思いつつ
クエリにフィールドを一つ増やして
Eval(BuildCriteria("'" & [対象フィールド] & "'",10,"*" & Replace([検索文字列],",","* or *") & "*"))
抽出条件:false
目的も状況もわからずスマートではないと思っているのでとりあえず解説はありません

9
hatena 2019/06/04 (火) 14:59:45 修正

VBAで自作関数を作成する場合の方法です。

標準モジュールに下記の関数を作成してください。

Public Function IncludWords(sText, Words) As Boolean
    If Nz(sText, "") = "" Or Nz(Words, "") = "" Then Exit Function
    
    Dim Word

    For Each Word In Split(Words, " ")
        If sText Like "*" & Word & "*" Then
            IncludWords = True
            Exit For
        End If
    Next

End Function

クエリで下記のように設定してください。

フィールド 式1: IncludWords([対象フィード], "○○ □□ △△")
抽出条件  False

上記のように禁止ワードを空白区切りで入力します。
これで、○○、□□、 △△ のどれかを含むものは除外されます。

抽出条件を True にすればどれかを含むものが抽出されます。

10

自作関数勉強になります。仕事で使っているmdbは、ORACLEとのリンクテーブルでしてフィールドのを追加する事が出来ませんがこの知識は今後役に立ちそうです。有難う御座いました。

11

再投稿します。やはり必要に迫られてODBC経由のリンクテーブルである場合の上記の対応策は、ありませんでしょうか?ご教授お願い致します。

12

リンクテーブルだとうまくいかないのですか。
どのようにうまくいかないのですか。
エラーがでるならエラーメッセージをご提示ください。

13

ご返答有難うございます。自作関数を試したのですが家のパソコンでは上手くいくのですが、会社のwin7 office 2000では○○を含む文字列を除外しようとしても表示されてしまいます。エラーは、表示されません。自宅環境は、win10 office 2003です。宜しくお願い致します。

14

office2000 ですか。こちらには環境がないので動作確認は難しいですね。
8番目のコメントの名前なしさんの式も試してみてください。

15

名前なしさんの式は、使い方が分かりませんでしたが、テーブルを作る方法が上手く行きました。大変助かりました。有難う御座いました。