Last Update : 2008/03/24

Q.データを検索するとき、大文字と小文字、カタカナとひらがなは区別したいんですけど。
このコンテンツに関連したおすすめ書籍: 日本語全文検索システムの構築と活用

コメント: Accessとは関係ない本(しかもnamazu)だけど、日本語全文検索のテクノロジって奥が深いのよ。興味ある方はぜひ。
カタカナとひらがな。全角と半角。大文字と小文字。ソートするときにこーゆー識別はできない、ということはここにも書いてあるんでわかったんですけど、でも、検索するときも区別できないってどーゆーことですか?別の文字なんだから、ちゃんと区別して抽出できなきゃ困りますぅ。

そーですよね。人名なんかでは区別がないほうが便利かもしれませんが、商品の型番などの場合、大文字・小文字が意味を持ってしまっている場合もありますから。どーしても区別しなきゃいけない事情だってありますよね。
こちらでも書いたのですが、Oracleではパラメータ一発で区別したりしなかったり設定ができますからこれが理想ですが、ザンネンながらAccessにはそんなものないので、ないものねだっててもしょうがありません。

StrComp関数という、バイナリ比較テキスト比較を使い分けして比較結果を返してくれる関数があります。これを検索条件式で利用すれば、通常では違いを識別できない文字もちゃんと判別することができます。

例: select * from 商品マスタ where StrComp( code , "Abc",vbBinaryCompare) = 0

StrComp関数は、第1引数と第2引数を比較し、等しい場合は0を返しますので、codeという項目の値が「Abc」であるレコードは抽出されますが、「aBC」「ABC」対象外になります。第3引数のvbBinaryCompareは「バイナリ比較する」という意味です。詳しくはHelpでご確認を。


でも、StrComp関数は、完全比較しかできませんから、「Abcを含むデータを検索したい」場合、ダメですよね。
そんなときは、InStr関数。この関数もStrComp関数と同じようにバイナリ比較指定ができますので、「Abc」を含んでいるかどうかの判断に使うことができます。

例: select * from 商品マスタ where InStr(1, code , "Abc",vbBinaryCompare) > 0

第3引数で指定した文字が見つからなければInStr関数は0を返しますので、codeという項目に「Abc」が含まれているレコードは抽出されますが、「aBC」「ABC」が含まれているだけでは抽出されません。第4引数のvbBinaryCompareは「バイナリ比較する」という意味です。詳しくはHelpでご確認を。

ただし、どちらの方法も、関数を挟んでいるため通常の検索よりは当然遅くなります。インデックスも使われません。
どうしても区別をつけて抽出したい場合以外は使わないほうがいいと思います。


この件に関しましてご質問がございましたら、こちらまで。


この情報は、お客様の疑問・問題解決のお役に立ちましたか?
満足度を左から右へ高い順へご選択ください。


←役に立った 9 8 7 6 5 4 3 2 1 役に立たない→
この情報へのご意見、ご要望がございましたらこちらへご記入ください。
( 全角 500 文字以内 )








Top へもどる