如何搜索部分/掩码字符串?

时间:2013-06-29 19:09:42

标签: php mysql search pdo

我将社会安全号码存储在数据库中,但是我只存储了5位数的序列,而不是存储整数。因此,如果SSN#是123-12-1234,我的数据库将存储它#23121 ###或#### 21234或其他任何内容,只要它在行中有5位数。

因此,当用户输入整个SSN时,我希望数据库找到所有匹配项。

所以,我可以这样做:

SELECT * FROM user WHERE ssn like 123121234

但上面的查询不起作用,因为我在SSN字段中有一些屏蔽字符(#23121 ###)。这样做有好办法吗?

也许一个好方法是使用

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

虽然可能存在问题 - 查询可能会返回不相关的匹配项,因为我存储在数据库中的5个数字可能位于序列中的任何位置。

知道如何更好地搜索?

2 个答案:

答案 0 :(得分:2)

如果数字始终位于顺序块中,则只需生成可存储在数据库中的ssn的5种变体并以完全匹配的方式搜索所有变量,即可生成非常有效的查询。此查询还可以使用索引来加快速度。

SELECT * 
FROM user 
WHERE ssn IN ('12312####', 
              '#23121###', 
              '##31212##', 
              '###12123#', 
              '####21234');

答案 1 :(得分:1)

我认为你可以这样做:

  1. 从查询的SSN中提取所有可能的5-char组合。
  2. 对这些数字进行IN()查询。我不确定你会得到多少结果。

    $n = 123121234;
    $sequences = array();
    
    for($i = 0; $i + 5 <= strlen($n); $i++) {
        $sequences[] = substr($n, $i, 5);
    }
    
    var_dump($sequences);
    
  3. 告诉我你是否需要围绕字符串的那些哈希符号。