1

社会保障番号をデータベースに保存していますが、整数を保存する代わりに、5 桁のシーケンスのみを保存しています。したがって、SSN 番号が 123-12-1234 の場合、行に 5 桁ある限り、データベースには #23121### や ####21234 などの番号が格納されます。

したがって、ユーザーが SSN 全体を入力すると、データベースがすべての一致を検索する必要があります。

だから、私はこれを行うことができます:

SELECT * FROM user WHERE ssn like 123121234

しかし、SSN フィールドにマスクされた文字 (#23121###) があるため、上記のクエリは機能しません。これを行う良い方法はありますか?

多分良い方法は

SELECT * FROM user WHERE REPLACE (ssn, '#', '') like 123121234

問題が発生する可能性がありますが、DB に保存する 5 つの数字はシーケンス内のどこにでもある可能性があるため、クエリは関連性のない一致を返す可能性があります。

より良い検索を行う方法はありますか?

4

2 に答える 2

2

数字が常に連続したブロックにある場合、DB に格納できる ssn の 5 つのバリエーションを生成し、完全に一致するすべてのバリエーションを検索するだけで、非常に効率的なクエリを生成できます。このクエリは、インデックスを使用して高速化することもできます。

SELECT * 
FROM user 
WHERE ssn IN ('12312####', 
              '#23121###', 
              '##31212##', 
              '###12123#', 
              '####21234');
于 2013-06-29T19:20:52.090 に答える
1

次のようなことができると思います:

  1. クエリされた SSN から、可能なすべての 5 文字の組み合わせを抽出します。
  2. これらの数値に対して IN() クエリを作成します。これでどれだけの結果が得られるかはわかりません。

    $n = 123121234;
    $sequences = array();
    
    for($i = 0; $i + 5 <= strlen($n); $i++) {
        $sequences[] = substr($n, $i, 5);
    }
    
    var_dump($sequences);
    

文字列を囲むハッシュ記号が必要かどうか教えてください。

于 2013-06-29T19:21:18.713 に答える