Searching for phone numbers in mysql

后端 未结 16 2318
耶瑟儿~
耶瑟儿~ 2020-12-30 06:40

I have a table which is full of arbitrarily formatted phone numbers, like this

027 123 5644
021 393-5593
(07) 123 456
042123456

I need to sea

相关标签:
16条回答
  • 2020-12-30 06:44

    This is a problem with MySQL - the regex function can match, but it can't replace. See this post for a possible solution.

    0 讨论(0)
  • 2020-12-30 06:44

    Woe is me. I ended up doing this:

    mre = mobile_number && ('%' + mobile_number.gsub(/\D/, '').scan(/./m).join('%'))
    
    find(:first, :conditions => ['trim(mobile_phone) like ?', mre])
    
    0 讨论(0)
  • 2020-12-30 06:46

    Create a user defined function to dynamically creates Regex.

    DELIMITER //
    
    CREATE FUNCTION udfn_GetPhoneRegex
    (   
        var_Input VARCHAR(25)
    )
    RETURNS VARCHAR(200)
    
    BEGIN
        DECLARE iterator INT          DEFAULT 1;
        DECLARE phoneregex VARCHAR(200)          DEFAULT '';
    
        DECLARE output   VARCHAR(25) DEFAULT '';
    
    
       WHILE iterator < (LENGTH(var_Input) + 1) DO
          IF SUBSTRING(var_Input, iterator, 1) IN ( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ) THEN
             SET output = CONCAT(output, SUBSTRING(var_Input, iterator, 1));
          END IF;
          SET iterator = iterator + 1;
       END WHILE;
        SET output = RIGHT(output,10);
        SET iterator = 1;
        WHILE iterator < (LENGTH(output) + 1) DO
             SET phoneregex = CONCAT(phoneregex,'[^0-9]*',SUBSTRING(output, iterator, 1));
             SET iterator = iterator + 1;
        END WHILE;
        SET phoneregex = CONCAT(phoneregex,'$');
       RETURN phoneregex;
    END//
    DELIMITER ;
    

    Call that User Defined Function in your stored procedure.

    DECLARE var_PhoneNumberRegex        VARCHAR(200);
    SET var_PhoneNumberRegex = udfn_GetPhoneRegex('+ 123 555 7890');
    SELECT * FROM Customer WHERE phonenumber REGEXP var_PhoneNumberRegex;
    
    0 讨论(0)
  • 2020-12-30 06:48

    I would use Google's libPhoneNumber to format a number to E164 format. I would add a second column called "e164_number" to store the e164 formatted number and add an index on it.

    0 讨论(0)
  • 2020-12-30 06:52

    I know this is ancient history, but I found it while looking for a similar solution.

    A simple REGEXP may work:

    select * from phone_table where phone1 REGEXP "07[^0-9]*123[^0-9]*456"
    

    This would match the phonenumber column with or without any separating characters.

    0 讨论(0)
  • 2020-12-30 06:52

    MySQL can search based on regular expressions.

    Sure, but given the arbitrary formatting, if my haystack contained "(027) 123 456" (bear in mind position of spaces can change, it could just as easily be 027 12 3456 and I wanted to match it with 027123456, would my regex therefore need to be this?

    "^[\D]+0[\D]+2[\D]+7[\D]+1[\D]+2[\D]+3[\D]+4[\D]+5[\D]+6$"
    

    (actually it'd be worse as the mysql manual doesn't seem to indicate it supports \D)

    If that is the case, isn't it more or less the same as my %%%%% idea?

    0 讨论(0)
提交回复
热议问题