2013-06-29 3 views
1

Я сохраняю номера социального страхования в базе данных, но вместо хранения целых чисел я сохраняю только 5-значную последовательность. Итак, если SSN # 123-12-1234, моя база данных сохранит его # 23121 ### или #### 21234 или что-нибудь еще, если у него есть 5 цифр в строке.Как искать частичные/маскированные строки?

Поэтому, когда пользователь вводит весь SSN, я хочу, чтобы база данных находила все совпадения.

Таким образом, я могу это сделать:

SELECT * FROM user WHERE ssn like 123121234 

Но выше запрос не будет работать, так как у меня есть несколько замаскированных символов в поле ПКР (# 23121 ###). Есть ли хороший способ сделать это?

Может быть хорошим способом было бы использовать

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

Хотя может быть проблема - запрос может вернуться нерелевантные матчи с 5 номерами, которые я храню в БД может быть где угодно в последовательности.

Любая идея, как сделать лучший поиск?

+0

Являются ли незамасленные номера всегда последовательными (т. Е. 5 цифр в блоке или разложены)? Является ли производительность проблемой? –

+0

Всегда 5 номеров в строке, но их местоположение случайное – Andrew

+0

, так что это может быть '# 1 ## 1 # 111'? –

ответ

2

Если числа всегда находятся в последовательном блоке, вы можете создать очень эффективный запрос, просто создав 5 вариаций ssn, которые могут быть сохранены в БД, и искать их все с точным соответствием. Этот запрос также может использовать индексы для ускорения работы.

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

Я думаю, что вы можете сделать что-то вроде этого:

  1. извлечь все возможные комбинации 5-символьные из запрашиваемых ССН.
  2. Сделайте запрос IN() для этих чисел. Я не уверен, сколько результатов вы получите от этого.

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

Скажите мне, если вам нужны эти решётку окружающие строки.

Смежные вопросы