Microsoft Access 掲示板

クエリの抽出条件に当てはまらないはずなのに

17 コメント
views
4 フォロー

こんにちは。

郵便番号が7桁でないレコードを抽出したく、郵便番号フィールドに、Not Like "#######"という抽出条件を設定しました。

しかし、000-000というデータが抽出条件をすり抜けてしまいました。7桁ではありますがハイフンは数字ではないはずなのに、なぜ抽出条件をすり抜けてしまうのでしょうか?

また、正しく7桁の半角英数字ではないものを抽出するためにはどのように抽出条件を記述すればよろしいでしょうか?

べらんめぇ
作成: 2023/11/30 (木) 15:16:21
通報 ...
1

「抽出条件をすり抜けてしまいました」とは、具体的にどうなったのでしょうか。
「000-000」というデータが表示されたのか、表示されなかったのか、どちらでしょうか。

Not Like "#######" なら表示されるのが正常です。
こちらでサンプルを作成しましたが、表示されました。

2
Sign is "B" 2023/12/01 (金) 08:45:10 7fdfc@46fae >> 1

000-000が、本来抽出されなければならないはずが抽出されませんでした。
000&000も、本来抽出されなければならないはずが抽出されませんでした。(別サンプル)

ちなみに、0から始まる郵便番号が正しく表示されるよう、郵便番号フィールドは短いテキスト型になっています。

3
hatena 2023/12/01 (金) 10:40:26 修正

そのフィールドに定型入力が設定されてませんか。
もし、されているならその設定を教えてください。

ちなみに郵便番号フィールドなら、000-0000 という書式になるはずですが、
000-000 というのはどのような事情でしょうか。

4
Sign is "B" 2023/12/01 (金) 11:05:20 7fdfc@46fae >> 3

定型入力は何も設定されておりませんでした。

レポート出力の際は7つテキストボックスを作成し、それぞれ=Mid([〒],1,1)~=Mid([〒],7,1)という風にしています。ですので郵便番号フィールドは、更新クエリでハイフンを""に置換し、7桁数字の書式にしています。

000-000や000&000は、7桁数字以外が抽出されているかどうかの検証中に抽出条件から外れていたので例えとして提示致しました。

"7桁の数字"以外が正確に抽出されるためにはどのような抽出条件を設定すれば良いか、というのが本題です。
Not Like "#######"
この抽出条件で一見問題ないように見えて、例のようなデータが抽出条件に引っかからなかったので、原因と対策を知りたいです。

5

フィールドの書式プロパティもなにも設定されてませんか。

こちらで作成したサンプルでは正しい結果になってますね。

画像1

画像1

上記の画像のようなサンプルを新規作成した場合はどうなりますか。

6
Sign is "B" 2023/12/01 (金) 17:16:41 7fdfc@46fae

同じサンプルを作成したところ、Hatenaさんと同じ実行結果になりました。
他に何か抽出条件が設定されているのではないかと思い探してみたところ、

フィールド:LenB(StrConv(Nz([T_出力].[〒],""),128))
抽出条件:<>"7"

上記が見つかりました。
いつ書いたのか、なぜ書いたのか、どんな意味なのか全く思い出せませんでしたが、こちらを消したところ、000-000や000&000は抽出されるようになりました。

しかし、今度は消す前は抽出されていた000-000が抽出されなくなってしまいました。
7桁の半角数字以外のレコードを抽出するという目的がまだ達成できていません。

7
フィールド:LenB(StrConv(Nz([T_出力].[〒],""),128))
抽出条件:<>"7"

これはおそらく全角文字以外がふくまれているかを判定したかったのでしょう。ただし、この式ではその目的を達成してません。
話がややこしくなるので、まずはこの条件は削除しておいて、Not Like "#######"の抽出条件の方が解決してから取り組みましょうか。

しかし、今度は消す前は抽出されていた000-000が抽出されなくなってしまいました。

私の提示したシンプルなサンプルのテーブルにそのデータを追加して試してみてください。
こちらのサンプルでは抽出されました。

問題のクエリに他に抽出条件はありませんか。

わからないようならSQLビューにして表示されるSQL文をコピーしてここに貼り付けてください。

8
Sign is "B" 2023/12/04 (月) 17:18:56 7fdfc@46fae >> 7

週を跨ぎ返事が遅くなりすみません。

SELECT T_出力.ID, T_出力.[〒], T_出力.住所1, T_出力.住所2, T_出力.社名1, T_出力.社名2, T_出力.社名3, T_出力.役職, T_出力.氏名, T_出力.敬称, T_出力.連名役職, T_出力.連名, T_出力.連名敬称, T_出力.備考
FROM T_出力
WHERE (((T_出力.[〒]) Not Like "#######"));

こちらSQL文です。

9

SQLには問題はなさそうてすね。

こちらのサンプルでは問題なく抽出されます。

ちょっと原因が想像できないです。

11
Sign is "B" 2023/12/05 (火) 08:40:03 7fdfc@46fae >> 9

すみません、000-000は抽出されます。
000ー000が抽出されません。(長音符)

12
hiroton 2023/12/05 (火) 09:57:40 049d8@f966d

データ的な問題以外の問題があるんですかね?
画像1

?"000ー000" like "#######"
False
?"000-000" like "#######"
False
?"000-000" like "#######"
False

上からそれぞれ、2行目の文字のコピペ、1行目の文字のコピペ、半角ハイフンです
hirotonのテストでは全て同じ結果になりました

この掲示板に記述された文字のコピペです。実際のデータと同じとは限りません

13

すみません、000-000は抽出されます。
000ー000が抽出されません。(長音符)

長音符ですか。
こちらのサンプルのクエリでも再現できました。

画像1

これはバグっぽいですね。
って調べてみたら私のプログでも紹介してましたね。
すっかり忘れてました(-_-;)

長音「ー」を含むデータをクエリであいまい抽出すると - hatena chips

14

hirotonさんも確認されてますが、VBAなら問題なさそうなので下記で紹介しているLike演算子代替ユーザー定義関数 LikeB を使えば長音府も抽出できますね。

クエリで大文字/小文字、全角/半角を区別して文字列比較をしたい - hatena chips

15

また、正しく7桁の半角英数字ではないものを抽出するためにはどのように抽出条件を記述すればよろしいでしょうか?

全角文字を含む場合も抽出したいということですね。
例えば 0000000 とか。
その場合は、下記のような抽出条件にします。

SELECT [テーブル2].*
FROM テーブル2
WHERE [F1] Not Like "#######" OR LenB(StrConv(Nz([F1],""),128))<>Len(F1);

これなら、長音符は全角なので、長音符を含むものも抽出されます。

16
hiroton 2023/12/05 (火) 12:15:20 049d8@f966d

なるほど、クエリにバグありですか。こまったもんですねぇ
画像1

ちょっとクエリ上ではどうにもならなさそうな感じだったのでACCESSのクエリでワイルドカード比較はNG、代替手法を使うしかないって感じになりそう

17
hiroton 2023/12/05 (火) 16:57:49 049d8@f966d

7桁の郵便番号として、半角数字7文字であることを確認する計算式を考えてみました

StrComp("1" & [F1],10000000+Val([F1]),0)