とある仕事で、Access のシステムを作っていた時に、あいまい検索を実装するため Like を使って検索をしていると、なぜか条件に合っていないものが検索されてしまうことに気付いた。
なんでだろうといろいろ調べていて、ようやくたどり着いた結果・・・
Access のバグだった(泣)
調べているとこれ、20年近くたっても直っていない Access のバグ。
Like で検索文字の2文字目の前に長音が入っていると検索に上がってしまうバグ。
例えばレコード内の文章において「当番」という言葉を含むものを検索するときクエリで抽出条件に
「Like “*当番*”」
と書くと思うけど、これで検索すると「当番」を含む言葉はもちろん検索できるけど、こんなのも上がってきてしまう。
「該当のオーダー番号は、〇〇です。」
今回の場合「当番」という言葉の、1番目の検索文字「当」と、2番目の検索文字の「番」のすぐ前に全角長音「ー」があると、1番目と2番目の前の長音の間に何文字入っていても検索されてしまう。
簡単に書くと
当番 ←これはもちろん上がってくる
〇〇当〇〇〇〇ー番 ←で、こんなのも上がってくる
とか、そんな並びのものが全部検索されてしまうんよね。
うーん、まあ日本語くらいでしか起こらないことなので、Microsoft も放置なのかな。
多分20年以上たっても直ってないから、今後も直らないんじゃないかな・・・
なので、解決方法はいくつかあるようだけど、一番簡単なのは全角長音を半角長音にする。
マジか・・・(笑)
半角長音だとちゃんと検索できるんだって。
だから、クエリで実行するのなら Replace とかで全角長音「ー」を半角長音「-」に置き換えて検索する方法をしました。
例えば検索したい「当番」の文字が入っている「フィールド1」をLikeを使って検索するなら
「Replace ([フィールド1],”ー”,”-“)」
にして
抽出条件に
「Like “*当番*”」
とするとちゃんと「当番」だけがはいっている文章が検索できるようになる。
でもこれ探しててもなかなか見つからなかったので、普通にみんな知ってることなのかなぁ・・・
それとも気付いてないのかな・・・
とりあえず自分の備忘録も含め、困っている人もいるかもしれないので、書いておこうと。