0

I am trying to match a numeric value that is purely numbers to another value in my database that is the same numbers but has symbols etc (it's phone numbers).

How can I get MySQL to only match the regexp of the mainNumber column (which has symbols etc in it) to my value (just numbers)?

Below is my code:

$SQL = "SELECT entities.name
        FROM entities_main_numbers
           LEFT JOIN entities ON entities.id = entities_main_numbers.entityId
        WHERE mainNumber = ?
        LIMIT 1";

E.g. +44 (0)800 123 123 to match against 440800123123

imperium2335
  • 23,402
  • 38
  • 111
  • 190

4 Answers4

2

MYSQL SOLUTION

you can use mulitple replace statements

 WHERE REPLACE(REPLACE(REPLACE(REPLACE(mainNumber, '+', ''), ')', ''), '(', ''), ' ', '') = $targetNum

very ugly but it works. replaces ('+', ' ', '(', ')') with ''

this will convert this number +44 (0)800 123 123 to this number 440800123123 making your statement true if $targetNum = 440800123123

OR PHP SOLUTION

PHP

 $targetNum = preg_replace('/(\d\d)(\d)(\d\d\d)(\d\d\d)(\d\d\d)/', '+$1 ($2)$3 $4 $5', $targetNum);

 // will convert 440800123123 to +44 (0)800 123 123
 // essentially matching the way mainNumber is stored

SQL

 WHERE mainNumber = $targetNum

might be a better solution because it's less taxing on the database

Jay Harris
  • 4,201
  • 17
  • 21
1

You can be creative and match the 9 digits from the right after getting rid of the spaces, but if the full number is needed you can place few more recursive calls to REPLACE eliminating the () and +

mainnumber = RIGHT(REPLACE('+44 (0)800 123 123', ' ', ''), 9);
DevZer0
  • 13,433
  • 7
  • 27
  • 51
0

very ugly, but if you just want to use built in functions, you can use a chain of REPLACE to filter out any characters you dont want.
eg:

SELECT REPLACE(
  REPLACE(
    REPLACE(
      REPLACE(
        entities.name," ","")
      ,"+","")
    ,"(","")
  ,")","") FROM entities_main_numbers;
kennypu
  • 5,950
  • 2
  • 22
  • 28
0

I'm not an MySQL-expert, but you could probably create a function that takes the numeric value. e.g. '440800123123' and transforms it into a regex like

'\D*4\D*4\D*0\D*8\D*0\D*0\D*1\D*2\D*3\D*1\D*2\D*3\D*'

(\D <=> [^0-9] in case this is not defined in MySQL)

This you could use with the normal REGEXP-command...

mishik
  • 9,973
  • 9
  • 45
  • 67
AKDADEVIL
  • 206
  • 1
  • 7