sql >> Database >  >> RDS >> Mysql

Alle niet-numerieke tekens uit een veld verwijderen

Er is geen "ingebouwde" functie die deze bewerking in MySQL kan uitvoeren.

Een optie is om uw eigen opgeslagen functie te creëren (als u voldoende rechten heeft op de database).

 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 ;

En zorg ervoor dat u test dit voordat je het gebruikt een UPDATE-statement.

 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

Retourneren:

 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

(De laatste twee rijen kunnen ons een pauze geven om te heroverwegen wat we echt willen bereiken. Als ik het was, zou ik een nieuwe kolom maken en de bestaande waarde erin opslaan voordat ik een UPDATE deed.)

 -- 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. Hoe AT TIME ZONE werkt in PostgreSQL

  2. Basis DB-verbindingspool met Java en Tomcat 7

  3. Is MySQL Connector/JDBC-thread veilig?

  4. Op PostgreSQL gebaseerde applicatieprestaties:latentie en verborgen vertragingen