2012-11-01 3 views
0

새로운 레스토랑 목록이 있는데 전화 번호를 사용하여 레스토랑 데이터베이스와 비교하고 싶습니다. 전화 번호 문제는 데이터베이스의 형식이 다른 것입니다 (예 : 123-345-6789 또는 (123)-456 8988).레일에서의 SQL 쿼리 중 숫자가 아닌 값의 전화 번호 제거

지금까지 전화 색인을 작성하여 빠르게 검색했습니다. 또한 새 레스토랑의 전화 번호를 삭제하여 숫자 값 (0-9) 만 포함 시켰습니다.

이제 데이터베이스를 비교하기 전에 숫자를 엄격하게 비교하기 위해 데이터베이스의 숫자를 제거하고 싶습니다.

위 코드의 문제점은 contact_phone (데이터베이스에서)이 스트립되지 않은 형식으로되어 있다는 것입니다. 지금까지의 연구 결과에 의하면 REGEXP_LIKE과 같은 것을 사용해야한다고 믿어 왔지만 레일즈로 이것을 어떻게 구현할지는 모르겠습니다. 데이터베이스를 업데이트하고 싶지는 않습니다. DB의 원래 형식을 그대로 유지하면서 비교하기 위해 숫자를 제거하기 만하면됩니다.

숫자가 아닌 값인 contact_phone의 전화 번호를 formatted_phone과 비교하기 전에 데이터베이스에서 제거하려면 어떻게합니까?

+0

당신 contact_phone의 포맷되지 않은 값을 전달하는 데이터베이스에 새로운 필드를 만들 수 있습니다 (원본을 유지하면서) – tamersalama

+0

@tamersalama 그래, 그렇긴하지만 중복 된 데이터가 있음을 의미합니다. – Huy

답변

1

그냥 레일 쿼리 (대신 제대로 데이터베이스에있는 다른 필드에 전화 번호를 포맷)에 노력을 제한하려는 경우 여기에 당신이 당신의 DB 엔진의 정규 표현식 기능을 사용할 수있는 방법은

Restaurant.where(["REGEXP_REPLACE(contact_phone, '[^[:digit:]]', '') = ?", formatted_phone]).each do |r| 
    #irrelevant code here 
end 
+1

모든 엔진에서 REGEXP_REPLACE가 작동하지 않습니다 (이 예에서는 Oracle 기능이 표시됨). 나는 MySQL에 내장 된 REGEXP_REPLACE 함수가 있다고 생각하지 않는다. – tamersalama

+0

나는 이것을 시험해보고 있었고 REGEXP_REPLACE가 존재하지 않는다는 오류를 계속 받았다. 당신이 당신의 의견에 지적했듯이. 이 문제를 해결할 수있는 방법에 대한 팁이 있습니까? – Huy

+0

나는 이것을 좀 더 들여다 보았다. MySQL과 함께 구현하기가 쉬운 것처럼 보입니다. 또한, 이렇게하면 각 레코드를 반복해야합니다. 수십만 데이터베이스에서 이것은 너무 느립니다. 도움과 통찰력에 감사드립니다. – Huy