Pertanyaan MySQL REGEXP - Menghapus spasi dan karakter non-numerik


Saya ingin melakukan pencarian di database MySQL untuk nomor telepon.

Saat ini dengan kueri ini:

SELECT person FROM people WHERE phone_number RLIKE '123456789'

Itu tidak akan menemukan:

(123) 456 789
(12) 456789
123 456 789
etc etc

Dalam permintaan MySQL saya apakah mungkin untuk menghapus semuanya dan hanya meninggalkan angka?

Saya juga ingin mencari menghapus semua spasi dan hanya meninggalkan angka dan karakter dan juga menghapus semua karakter dan hanya meninggalkan angka dan spasi. Tidak yakin betapa mudahnya semua ini.

Hargai bantuan Anda!


5
2018-01-13 01:41


asal


Jawaban:


bagaimana tentang:

SELECT
    person,
    replace(replace(replace(replace(phone_number,' ',''),'(',''),')',''),'-','') as phone_number
FROM
    people
WHERE
    phone_number RLIKE '^[+]?[-() 0-9]+$';

mencocokkan angka yang dimulai dengan tanda tambah, mereka mungkin berisi tanda hubung, tanda kurung dan spasi. tetapi tidak ada tanda plus selain di awal. dan juga tidak ada karakter. juga menghilangkan tanda hubung, spasi dan tanda kurung.


8
2018-01-13 02:21



Aku bisa memikirkan dua cara untuk melakukannya, tidak secantik yang kuharapkan.

Pertama: Gunakan regex di RLIKE untuk mengizinkan spasi dan tanda kurung di mana-mana:

SELECT person 
 FROM people
 WHERE phone_number RLIKE '[() ]*1[() ]*2[() ]*3[() ]*4[() ]*5[() ]*6[() ]*7[() ]*8[() ]*9'

Pada dasarnya mengatakan ada tanda kurung dan spasi di antara setiap angka. Agak canggung untuk membuat string. Jika Anda memanggil mySQL dari bahasa lain (katakanlah php) Anda bisa menggunakan bahasa lain untuk mengubah '123456789' menjadi 'x1x2x3x4x5x6x7x8x9' di mana 'x' adalah [() ]*.

Kedua: gunakan mysql REPLACE untuk menghapus spasi dan tanda kurung sebelum melakukan perbandingan:

SELECT person 
 FROM people
 WHERE REPLACE(REPLACE(REPLACE(phone_number,' ',''),'(',''),')','') = '123456789';

Ini berturut-turut menggantikan spasi, kurung buka, dan kurung tutup di phone_number dengan ''.

Saya pikir saya lebih memilih metode kedua ini. Untuk menghapus semua ruang yang Anda butuhkan REPLACE(phone_number,' ','') dan menghapus semua () kamu butuh dua REPLACE.

Saya kira yang pertama lebih fleksibel sehubungan dengan penambahan karakter ekstra. Sayang sekali MySQL tidak memiliki regex-enabled REPLACE!


4
2018-01-13 02:07



saya melakukan fungsi yang mengembalikan semua nomor saja .. lalu saya memanggil fungsi tersebut

SELECT person FROM people WHERE returnNumericOnly(phone_number) = '123456789'

fungsi saya seperti ini:

DELIMITER $$

USE [tablename]$$

DROP FUNCTION IF EXISTS `returnNumericOnly`$$

CREATE DEFINER=`root`@`localhost` FUNCTION `returnNumericOnly`(str VARCHAR(1000)) RETURNS VARCHAR(1000) CHARSET latin1
DETERMINISTIC
BEGIN
  DECLARE counter INT DEFAULT 0;
  DECLARE strLength INT DEFAULT 0;
  DECLARE strChar VARCHAR(1000) DEFAULT '' ;
  DECLARE retVal VARCHAR(1000) DEFAULT '';

  SET strLength = LENGTH(str);

  WHILE strLength > 0 DO
    SET counter = counter+1;
    SET strChar = SUBSTRING(str,counter,1);
    IF strChar REGEXP('[0-9]+') = 1
      THEN SET retVal = CONCAT(retVal,strChar);
    END IF;
    SET strLength = strLength -1;
    SET strChar = NULL;
  END WHILE;
RETURN retVal;
END $$

DELIMITER ;

4
2018-01-13 04:01



cobalah bekerja seperti ini. Ini tidak baik tetapi akan memberi Anda apa yang Anda inginkan.

SELECT temp.person, p.phone_number
  FROM people p
 INNER JOIN (SELECT REPLACE(REPLACE(REPLACE(phone_number,' ',''),'(',''),')','') phone_number,id
              FROM test) temp
   ON p.id=temp.id -- primary key of the table
 WHERE temp.phone_number='123456789';

1
2018-01-13 02:07