Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Hapus semua karakter non-numerik dari bidang

Tidak ada fungsi "bawaan" yang akan melakukan operasi ini di MySQL.

Salah satu opsi adalah membuat fungsi tersimpan Anda sendiri (jika Anda memiliki hak istimewa yang memadai di 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 ;

Dan pastikan untuk menguji ini sebelum Anda menggunakannya sebagai pernyataan 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

Pengembalian:

 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

(Dua baris terakhir mungkin memberi kita jeda untuk mempertimbangkan kembali apa yang sebenarnya ingin kita capai. Jika itu saya, saya akan membuat kolom baru, dan menyimpan nilai yang ada di dalamnya, sebelum saya melakukan 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. Apa tipe data yang ideal untuk digunakan saat menyimpan garis lintang/bujur dalam database MySQL?

  2. Koneksi pdo tanpa nama database?

  3. Nginx - Mengunduh PHP alih-alih mengeksekusi

  4. Penjelasan Kerangka Ketersediaan Tinggi MySQL – Bagian II:Replikasi Semisinkron

  5. Meminta string dari kolom int?