1

我将社会安全号码存储在数据库中,但不是存储整数,而是只存储 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 个数字可能位于序列中的任何位置。

知道如何进行更好的搜索吗?

4

2 回答 2

2

如果数字总是在一个顺序块中,您可以生成一个非常有效的查询,只需生成可以存储在数据库中的 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 回答