我将社会安全号码存储在数据库中,但是我只存储了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个数字可能位于序列中的任何位置。
知道如何更好地搜索?
答案 0 :(得分:2)
如果数字始终位于顺序块中,则只需生成可存储在数据库中的ssn的5种变体并以完全匹配的方式搜索所有变量,即可生成非常有效的查询。此查询还可以使用索引来加快速度。
SELECT *
FROM user
WHERE ssn IN ('12312####',
'#23121###',
'##31212##',
'###12123#',
'####21234');
答案 1 :(得分:1)
我认为你可以这样做:
对这些数字进行IN()查询。我不确定你会得到多少结果。
$n = 123121234;
$sequences = array();
for($i = 0; $i + 5 <= strlen($n); $i++) {
$sequences[] = substr($n, $i, 5);
}
var_dump($sequences);
告诉我你是否需要围绕字符串的那些哈希符号。