Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Usuń wszystkie nieliczbowe znaki z pola

Nie ma żadnej "wbudowanej" funkcji, która wykona tę operację w MySQL.

Jedną z opcji jest utworzenie własnej funkcji przechowywanej (jeśli masz wystarczające uprawnienia do bazy danych).

 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 ;

I koniecznie przetestuj to przed użyciem instrukcji 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

Zwroty:

 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

(Ostatnie dwa wiersze mogą dać nam przerwę na ponowne rozważenie tego, co naprawdę chcemy osiągnąć. Gdybym to był ja, utworzyłbym nową kolumnę i zapisałby w niej istniejącą wartość, zanim wykonałbym UPDATE.)

 -- 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolejne rekordy SQL z liczbą

  2. App Engine i MySQL

  3. PHP mysqli_real_escape_string zwraca pusty ciąg

  4. Błąd MySql:1364 Pole 'display_name' nie ma wartości domyślnej

  5. Android JDBC nie działa:ClassNotFoundException na sterowniku