SQL, чтобы возвратить поле с нечисловыми символами, удаленными в MySQL - PullRequest
2 голосов
/ 21 июня 2010

У меня есть таблица MySQL, содержащая номера телефонов, которые могут быть отформатированы разными способами. Например:

  • (999) 999-9999
  • 999-999-9999
  • 999.999.9999
  • 999 999 9999
  • + 1 999 999 9999
  • 9999999999
  • 019999999999
  • и т.д.

Поле хранится в виде строки. Все, что я хочу сделать, это вернуть поле с удаленным нечисловым значением. Какой SQL можно использовать для этого в MySQL? Таким образом, все вышеприведенные значения вернут либо 9999999999, 19999999999, либо 019999999999.

Обратите внимание, что это запрос, который не будет выполняться регулярно, поэтому мне не нужно беспокоиться об оптимизации, индексации или чем-то еще. Однако мне нужно включить это в довольно сложное соединение с несколькими другими таблицами. На самом базовом уровне я пытаюсь найти дубликаты записей и хочу сгруппировать их или, по крайней мере, заказать по номеру телефона.

Ответы [ 5 ]

2 голосов
/ 21 июня 2010

Вы должны нормализовать эти числа перед тем, как вставить их в базу данных.
Храните его только в цифрах.
В противном случае это будет боль в шее, чтобы сделать это правильно.

1 голос
/ 22 июня 2010

Существует UDF для замены регулярных выражений (см. Как заменить регулярное выражение в MySQL? )

Или вы можете написать свой UDF, используя подстроку и проверку кода ASCII.

0 голосов
/ 30 января 2011

У меня была такая же проблема! Вы можете увидеть, как я решил это здесь .

Вот функции, которые я должен был создать и использовать, которые отлично сработали:

CREATE FUNCTION IsNumeric (val varchar(255)) RETURNS tinyint 
 RETURN val REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';

CREATE FUNCTION NumericOnly (val VARCHAR(255)) 
 RETURNS VARCHAR(255)
BEGIN
 DECLARE idx INT DEFAULT 0;
 IF ISNULL(val) THEN RETURN NULL; END IF;

 IF LENGTH(val) = 0 THEN RETURN ""; END IF;

 SET idx = REPLACE(val,".","");
 SET idx = LENGTH(val);
  WHILE idx > 0 DO
  IF IsNumeric(SUBSTRING(val,idx,1)) = 0 THEN
   SET val = REPLACE(val,SUBSTRING(val,idx,1),"");
   SET idx = LENGTH(val)+1;
  END IF;
  SET idx = idx - 1;
  END WHILE;
  RETURN val;
END;

CREATE FUNCTION FormatPhone (val VARCHAR(255))
 RETURNS VARCHAR(255)
BEGIN
  SET val = RIGHT(CONCAT("0000000000",NumericOnly(val)),10);
  RETURN CONCAT("(",LEFT(val,3),") ",LEFT(RIGHT(val,7),3),"-",RIGHT(val,4));
END;

Используйте его для форматирования номера телефона:

SELECT FormatPhone(PhoneNumberColumn) FROM TableName;

Или вот так, чтобы получить только цифры:

SELECT NumericOnly(PhoneNumberColumn) FROM TableName;
0 голосов
/ 21 июня 2010

Это работа для небольших регулярных выражений, но, к сожалению, MySQL не поддерживает замену регулярных выражений (если вы не хотите перекомпилировать его из источников ). Поэтому я бы сказал, что сделайте очистку на стороне кода, это будет намного проще.

0 голосов
/ 21 июня 2010

Вы можете использовать команду REPLACE, инкапсулирующую всю строку с различными вариациями, чтобы удалить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...