从字段中删除所有非数字字符

时间:2015-06-30 19:34:46

标签: mysql drupal

我有一个来自网络表单的结果集,其中包含每个集合的电话号码。此电话号码的格式未强制执行(有些是xxxxxxxxxx,有些是(xxx)xxx-xxxx,有些是xxx-xxx-xxxx)。这是短视的,现在我需要能够根据电话号码得到结果(视图暴露过滤器)。

我解决此问题的最佳方法是使用sql查询重新格式化此字段中的值,以便删除任何非数字值。我已经尝试了几个我在类似问题上找到的函数,但似乎没有工作(我正在使用mysql工作台并获得“函数不存在”错误)。这是我正在做的一次,我正在寻找一个可以运行的查询,它将删除所有非数字值。我只需要运行一次,因为我从这里验证电话号码只是数字。

是否有一个SQL查询可以满足我的需求?使用PHP它只是

update table set data = preg_replace("/[^0-9]/", "", data) where condition

但我似乎找不到用SQL做这件事的方法。

4 个答案:

答案 0 :(得分:7)

没有任何“内置”功能可以在MySQL中执行此操作。

一个选项是创建自己的存储函数(如果您对数据库有足够的权限)。

 DELIMITER $$

 DROP FUNCTION IF EXISTS `uf_only_digits`$$

 CREATE FUNCTION `uf_only_digits`(as_val VARCHAR(65535))
 RETURNS VARCHAR(65535)
 DETERMINISTIC
 BEGIN
   DECLARE retval VARCHAR(65535);
   DECLARE i INT;
   DECLARE strlen INT;
   -- shortcut exit for special cases
   IF as_val IS NULL OR as_val = '' THEN
     RETURN as_val;
   END IF;
   -- initialize for loop
   SET retval = '';
   SET i = 1;
   SET strlen = CHAR_LENGTH(as_val);
 do_loop:
   LOOP
     IF i > strlen THEN
       LEAVE do_loop;
     END IF;
     IF SUBSTR(as_val,i,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN
       SET retval = CONCAT(retval,SUBSTR(as_val,i,1));
     END IF;
     SET i = i + 1;
   END LOOP do_loop;
   RETURN retval;
 END$$

 DELIMITER ;

在使用UPDATE语句之前,请确保测试

 SELECT t.foo
      , uf_only_digits(t.foo)
   FROM ( SELECT '' AS foo
          UNION ALL SELECT ' x'
          UNION ALL SELECT 'a1b2'
          UNION ALL SELECT '1-888-555-1212 ext 213'
          UNION ALL SELECT '1-800-FLOWERS'
        ) t

返回:

 foo                     uf_only_digits(t.foo)  newlen  
 ----------------------  ---------------------  --------
                                                       0
  x                                                    0
 a1b2                    12                            2
 1-888-555-1212 ext 213  18885551212213               14
 1-800-FLOWERS           1800                          4

(最后两行可能会让我们停下来重新考虑我们真正想要实现的目标。如果是我,我会创建一个新列,并在我进行更新之前保存其中的现有值。)

 -- new column same size as `phone` column
 ALTER TABLE mytable ADD COLUMN orig_phone VARCHAR(40) NULL 
   COMMENT 'original phone value, before update to all digits';

 UPDATE mytable t
    SET t.orig_phone = t.phone ;

 UPDATE mytable t
    SET t.phone = uf_only_digits(t.phone) ;

答案 1 :(得分:2)

它不漂亮,但是......

UPDATE table
SET data =
 CONCAT(
    IF (SUBSTRING(data, 01, 1) REGEXP '[0-9]', SUBSTRING(data, 01, 1), '')
,   IF (SUBSTRING(data, 02, 1) REGEXP '[0-9]', SUBSTRING(data, 02, 1), '')
,   IF (SUBSTRING(data, 03, 1) REGEXP '[0-9]', SUBSTRING(data, 03, 1), '')
,   IF (SUBSTRING(data, 04, 1) REGEXP '[0-9]', SUBSTRING(data, 04, 1), '')
,   IF (SUBSTRING(data, 05, 1) REGEXP '[0-9]', SUBSTRING(data, 05, 1), '')
,   IF (SUBSTRING(data, 06, 1) REGEXP '[0-9]', SUBSTRING(data, 06, 1), '')
,   IF (SUBSTRING(data, 07, 1) REGEXP '[0-9]', SUBSTRING(data, 07, 1), '')
,   IF (SUBSTRING(data, 08, 1) REGEXP '[0-9]', SUBSTRING(data, 08, 1), '')
,   IF (SUBSTRING(data, 09, 1) REGEXP '[0-9]', SUBSTRING(data, 09, 1), '')
,   IF (SUBSTRING(data, 10, 1) REGEXP '[0-9]', SUBSTRING(data, 10, 1), '')
,   IF (SUBSTRING(data, 11, 1) REGEXP '[0-9]', SUBSTRING(data, 11, 1), '')
,   IF (SUBSTRING(data, 12, 1) REGEXP '[0-9]', SUBSTRING(data, 12, 1), '')
,   IF (SUBSTRING(data, 13, 1) REGEXP '[0-9]', SUBSTRING(data, 13, 1), '')
,   IF (SUBSTRING(data, 14, 1) REGEXP '[0-9]', SUBSTRING(data, 14, 1), '')
,   IF (SUBSTRING(data, 15, 1) REGEXP '[0-9]', SUBSTRING(data, 15, 1), '')
,   IF (SUBSTRING(data, 16, 1) REGEXP '[0-9]', SUBSTRING(data, 16, 1), '')
)
WHERE condition

您可能需要多次复制连接的IF函数,具体取决于字段的长度和输入的格式。

查看SQLFiddle

中的查询

答案 2 :(得分:1)

这可能有用,但有点乏味:

从表格中获取编号列表

$result = mysql_query("Select ID, number from Table"); 

关于每个值

while ($row = mysql_fetch_array($result)) { 
$ID = $row["ID"]; 
$NUM = $row["number"]; 

然后执行正则表达式模式并将该值更新为ID

$NUM = eregi_replace("whateverregex","",$NUM); 

$sql = mysql_query("Update Table set number = $NUM where ID = $ID"); 
} 

答案 3 :(得分:-1)

在MySQL 8.0+上,有一个新的本机函数,称为REGEXP_REPLACE。一个解决该问题的方法是:

update table set data = REGEXP_REPLACE(data, '[^0-9]+', "") where condition