2016-08-10 9 views
0

클라이언트에있는 레거시 시스템에서 작업하고 있습니다. 전화 번호는 여러 가지 방법으로 저장됩니다. 예 :데이터베이스의 숫자 만 확인하는 SQL 쿼리

514-879-9989 
514.989.2289 
5147899287 

클라이언트는 전화 번호로 데이터베이스를 검색 할 수 있기를 원합니다.

데이터베이스에 저장된 데이터를 정규화하지 않으면 어떻게 될 수 있습니까? 이것이 가능한가?

SELECT FROM table WHERE phonenumber LIKE %input% 

하지만 그 DB에 계정으로 만 숫자 문자를 취합니다

나는 보이는 쿼리를 가질 수 있다면 궁금?

+0

전체 범위의 형식은 무엇입니까? 예를 들어, "+1 (514) 879-9898"과 같은 국제 형식이 있습니까? 구분 기호로 공백을? 다중 문자 구분 기호? – Bohemian

답변

0

내가 즉에서만 사용 가능 자리에 "정규화"값을 갖는 없습니다 (이 함께 걸릴 접근하고, 정규화 된 값에 추가로 열을 추가하지 않는 제한 NULL이 아닌

Update Table SET Column = 
replace 
    (replace 
    (replace(column, 
    '-','', 
    '.',''), 
' ','') 
) 

...)

검색에 대한 사용자 입력을 받아 전략적 위치에 와일드 카드를 추가합니다.

phonenumber LIKE '%315%555%1212%' 

내가 보장 아니에요하지만 그 제공된 검색 자리 것 : 예를 들어, 사용자는 다음 나는이에 대한 술어 동등 물이 쿼리를 실행할 것) 3155551212의 검색 입력을 제공하는 경우 더 넓은 검색을 위해 전체 3 자리 지역 코드, 3 자리 교환 (중앙 오피스) 코드 및 4 자리 라인 번호가되어야합니다. 예를 들어, 제공된 모든 숫자 사이에 와일드 카드를 추가하십시오.

phonenumber LIKE '%3%1%5%5%5%5%1%2%1%2%' 

이 후자의 방법은 의도하지 않은 것보다 더 많은 일치를 제공 할 수 있기 때문에 이상적이지 않습니다. 특히 사용자가 10 자리 미만을 제공하는 경우 데모로

'+1 (315) 555-7172 ext. 123' 

: 예를 들어, PHONENUMBER 값을 고려 문자열에서 숫자 문자를 추출합니다 MySQL의에는 내장 문자열 함수가

SELECT '+1 (315) 555-7172 ext. 123' LIKE '%3%1%5%5%5%5%1%2%1%2%' 
    , '+1 (315) 555-7172 ext. 123' LIKE '%315%555%1212%' 

없습니다.

이렇게하는 기능이 필요한 경우 예 :

SELECT only_digits_from('+1 (315) 555-7172 ext. 123') 

13155557172123 

당신은 그것을 수행하는 저장 기능을 만들어야 할 것입니다 돌아갑니다. 나는 SQL 문장에서 인라인으로 시도하지 않을 것이다. 그것은 길고보기 흉한 표현을 심하게 요구할 것이다.

+0

작성한 첫 번째 제안을 사용했습니다. 고맙습니다. – user3404390

1
$sql = "SELECT * FROM tab 
WHERE replace(replace(phone, '.', ''), '-', '') like '%". $input ."%'" 

예는 @ spencer7593 예에서 언급 한 바와 같이, 테이블의 값에 따라 대체 더 추가 할 수 있습니다

$sql = "SELECT * FROM tab 
WHERE replace(replace(replace(replace(replace(replace(phone, '.', ''), '-', ''), '+', ''), '(', ''), ')', ''), ' ', '') like '%". $input ."%'" 

을하지만 난 쿼리하기 전에 정리에 데이터를 선호하는 것이다.

+0

이것은 공백, 왼쪽 및 오른쪽 괄호, 더하기 기호 'x'등과 같이 나타날 수있는 다른 비 숫자 문자를 처리하도록 확장 될 수 있습니다. 주요 국가 코드와 확장자를 가진 전화 번호를 고려해보십시오. '+1 (315) 555-1212 ext. 234' – spencer7593

0

이것은 데이터베이스 열을 정리하는 데 자주 사용하는 코드입니다. 나는 당신의 목적에 부합하도록 수정했습니다. 열이

+0

클라이언트는 db를 정상화하고 싶지 않습니다. -_- 나는 알고 있습니다. 롤 – user3404390

+0

오케이. 그 코드 슬랩은 select 문에서 작동해야합니다. select 문에서 첫 번째 코드에서 마지막 코드로 바꾼 코드 만 사용하십시오. – Merenix

관련 문제