Tips

文字列を厳格に検索する

日付2019/06/12
ID19-004
バージョンv11以降
プラットフォームWin, Mac

4Dの検索と文字列比較のルールでは、ひらがなとカタカナは区別されません。 また小文字と大文字、拗音(ようおん)や促音(そくおん)なども区別されません。

例えば、以下のコードで$mの値は、すべてTrueになります。

$m:=("ABC"="abc")
$m:=("いしゃ"="いしや")
$m:=("ウォッカ"="うおつか")

このルールは、非常に実務的で便利だと思いますが、時として厳格なルールで検索や文字列比較を行いたいと思うこともあります。

完全一致を前提とするのであれば、検索対象をハッシュ化して文字列比較することで、厳格な文字列比較を行うことができます。

Tips:文字列の厳格な比較

このように、文字列の比較にはハッシュ化するテクニックが有用です。

では検索のときには、どのようにすればよいでしょうか。

検索する文字が常に完全一致を前提としているようなケース、例えばメールアドレスの管理を行うようなケースでは、メールアドレスをハッシュ化した検索用のフィールドを用意して検索用途に利用することが可能です。 では部分一致などの場合には、どのような方法があるのでしょう。

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コマンドは正規表現で文字比較をするコマンドですので、正規表現式に使われる記号をエスケープする必要があります。

Tips:正規表現のエスケープ

エスケープを考慮する必要がない場合には、先のコードをそのまま使うことができます。