Tips

"@"を含む文字列の検索

日付2000/01/31
ID00-002
バージョン
プラットフォーム

この記事は、最新ではないバージョンに関連した方法について解説しています。

最新のバージョンでは推奨されていないか、または他の方法で簡単に実現できる可能性があります。

4Dは1バイトの"@"をワイルドカードとして認識します。ここでは電子メールアドレス等の"@"を含む文字列の検索について考察します。

インターネットの広まりにともない、データベースに電子メールアドレスを保管するケースが増えてきました。またv6.5からは"4D Internet Commands"を使用して、4D自身がメールクライアントになることもできるようになりました。アドレス帳等の機能を実装する場合にはメールアドレスをデータベースから検索したくなることでしょう。この場合考慮しなければならないのが、4Dは1バイトの"@"をワイルドカードとして認識するということです。

例えば"taro@aci.co.jp"を検索するために

QUERY ([Person]E_Mail="taro@aci.co.jp")

を実行した場合、検索結果の中には"taro@aci.co.jp"だけではなく、(もしあれば)"taro-san@aci..co.jp"や"taro@friend.aci..co.jp"も含まれることになります。つまり"@"を含む文字列を検索する場合は、検索結果が期待とは違ったものになる可能性があるということです。このことを知ったうえで電子メールアドレス等の検索をどのように実装するかを検討する必要があります。

以下いくつかの方法を紹介します。

そのまま使用する

"@"をワイルドカードのまま検索で使用するということです。この場合上で示した通り完全に一致しないレコードもセレクションに含まれることになりますが、これを候補一覧として表示し、最終的に必要なレコードをユーザに選んでもらいます。この方法の利点は疑似的なあいまい検索ができるということです。"@"前後については完全に一致しなくても検索することができますのでかえって使いやすいインターフェースになる可能性があります。例えばメールアドレスの会社名の部分がはっきりしない場合、"taro@co.jp"で検索すればアカウンが"taro"で"co.jp"のドメインを持つアドレスがすべて検索されます。

データベースプロパティの設定を変更する

4D v6.5ではワイルドカード"@"の動作をデータベースプロパティで変更することができます。この設定により文字中の1バイト"@"をワイルドカードとして認識させるか、文字として認識させるかを設定します。詳細については『v6.5における"@"の設定とその動作、および影響範囲について』を参照してください。

1バイト"@"のかわりに他の文字を使用する

例えば2バイト"@"を代用文字として使用することができます。 メソッドで変換を行う例は以下のようになります。

    $vl_Length:=Length([Person]E_Mail)
    For ($i;1;$vl_Length)
      If (Ascii([Person]E_Mail[[$i]])=Ascii("@"))
        [Person]E_Mail:=Insert string([Person]E_Mail;" ";$i+1)
        [Person]E_Mail:=Change string([Person]E_Mail;"@";$i)
        $i:=$vl_Length
      End if 
    End for 

この場合、検索の実装も開発者が行う必要があります。

検索時に1バイト"@"の代わりに2バイト"@"を用いる

検索エディタやメソッド中のQUERYに渡すクエリ条件の部分で、1バイト"@"の代わりに2バイト"@"を使用します。例えば、

QUERY ([Person];[Person]E_Mail="taro@aci.co.jp")  `@は2バイト文字

4Dは検索時に1バイト"@"と2バイト"@"を区別しませんので、正しい結果が返されます。

"@"の前後を別々のフィールドに保存する

例えば電子メールの場合アカウントとドメインをそれぞれ別のフィールドとします。検索を行う場合は条件を"&"でスタック(複合条件)させます。