sql >> Databáze >  >> RDS >> Mysql

Odstraňte z pole všechny nečíselné znaky

Neexistuje žádná „vestavěná“ funkce, která by tuto operaci v MySQL provedla.

Jednou z možností je vytvořit si vlastní uloženou funkci (pokud máte dostatečná oprávnění k databázi).

 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 ;

A nezapomeňte testovat to předtím, než jej použijete, příkaz 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

Vrá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

(Poslední dva řádky by nám mohly dát pauzu, abychom znovu zvážili, čeho skutečně chceme dosáhnout. Kdybych to byl já, vytvořil bych nový sloupec a uložil bych do něj stávající hodnotu, než bych provedl AKTUALIZACI.)

 -- 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. Funkce MySQL LN() – Vrátí přirozený logaritmus čísla

  2. Jak omezit výsledky v MySQL, PostgreSQL a SQLite

  3. Jak vybrat řádky, které mají časové razítko aktuálního dne?

  4. Zabezpečení serveru MySQL