sql >> Databasteknik >  >> RDS >> Mysql

Ta bort alla icke-numeriska tecken från ett fält

Det finns ingen "inbyggd" funktion som gör den här operationen i MySQL.

Ett alternativ är att skapa din egen lagrade funktion (om du har tillräckliga privilegier på databasen).

 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 ;

Och se till att testa detta innan du använder det en UPDATE-sats.

 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

Returnerar:

 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 sista två raderna kan ge oss en paus för att ompröva vad vi verkligen vill uppnå. Om det var jag skulle jag skapa en ny kolumn och spara det befintliga värdet i den innan jag gjorde en UPPDATERING.)

 -- 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. Att göra fallet för INSTAAD OF Triggers – Del 1

  2. Blanda ANSI 1992 JOINs och COMMAs i en fråga

  3. 15 Grundläggande MySQL-intervjufrågor för databasadministratörer

  4. Det går inte att trunkera tabellen eftersom den refereras av en FOREIGN KEY-begränsning - SQL Server / TSQL Tutorial Del 70