文字列を厳格に検索する
日付 | 2019/06/12 |
---|---|
ID | 19-004 |
バージョン | v11以降 |
プラットフォーム | Win, Mac |
4Dの検索と文字列比較のルールでは、ひらがなとカタカナは区別されません。 また小文字と大文字、拗音(ようおん)や促音(そくおん)なども区別されません。
例えば、以下のコードで$mの値は、すべてTrueになります。
$m:=("ABC"="abc") $m:=("いしゃ"="いしや") $m:=("ウォッカ"="うおつか")
このルールは、非常に実務的で便利だと思いますが、時として厳格なルールで検索や文字列比較を行いたいと思うこともあります。
完全一致を前提とするのであれば、検索対象をハッシュ化して文字列比較することで、厳格な文字列比較を行うことができます。
このように、文字列の比較にはハッシュ化するテクニックが有用です。
では検索のときには、どのようにすればよいでしょうか。
検索する文字が常に完全一致を前提としているようなケース、例えばメールアドレスの管理を行うようなケースでは、メールアドレスをハッシュ化した検索用のフィールドを用意して検索用途に利用することが可能です。 では部分一致などの場合には、どのような方法があるのでしょう。
Match regexを使い、正規表現式でクエリをすることで、標準のルールとは別の文字列比較を行うことが可能です。 この場合には、QUERY BY FORMULAコマンドを使いますが、このコマンドはインデックス検索を行わないので、インデックスのあるフィールドの場合にはQUERYコマンドとQUERY SELECTION BY FORMULAコマンドの合わせ技を使うことになります。 最初のQUERYコマンドでインデックスを利用して検索を行い、QUERY SELECTION BY FORMULAコマンドで絞り込むことでインデックスを利用できます。
次の例題は、検索の具体的なコードの一例です。
//例 $str:="きって" //検索する文字列の例 //完全一致 QUERY([Table_data];[Table_data]Field_string=$str) QUERY SELECTION BY FORMULA([Table_data];Match regex("^"+$str+"$";[Table_data]Field_string;1)) //前方一致 QUERY([Table_data];[Table_data]Field_string=$str+"@") QUERY SELECTION BY FORMULA([Table_data];Match regex("^"+$str;[Table_data]Field_string;1)) //部分一致 QUERY([Table_data];[Table_data]Field_string="@"+$str+"@") QUERY SELECTION BY FORMULA([Table_data];Match regex($str;[Table_data]Field_string;1))
しかし、上記のコードでは実際には不十分です。
Match rexexコマンドは正規表現で文字比較をするコマンドですので、正規表現式に使われる記号をエスケープする必要があります。
エスケープを考慮する必要がない場合には、先のコードをそのまま使うことができます。