Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Xóa tất cả các ký tự không phải số khỏi một trường

Không có bất kỳ hàm "nội trang" nào thực hiện thao tác này trong MySQL.

Một tùy chọn là tạo chức năng được lưu trữ của riêng bạn (nếu bạn có đủ đặc quyền trên cơ sở dữ liệu).

 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 ;

Và hãy chắc chắn để kiểm tra điều này trước khi bạn sử dụng nó, một câu lệnh CẬP NHẬT.

 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

Lợi nhuận:

 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

(Hai hàng cuối cùng có thể cho phép chúng tôi tạm dừng để xem xét lại những gì chúng tôi thực sự muốn đạt được. Nếu là tôi, tôi sẽ tạo một cột mới và lưu giá trị hiện có trong đó, trước khi tôi thực hiện CẬP NHẬT.)

 -- 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. làm thế nào để tách trên một cột bảng sql

  2. Cú pháp kích hoạt MySQL 'cập nhật trên cột'

  3. Lỗi SQL tôi không thể tìm ra điều này

  4. Xây dựng cơ sở dữ liệu khả dụng cao cho Moodle bằng cách sử dụng MySQL Replication

  5. Nhiều GROUP_CONCAT trên các trường khác nhau bằng MySQL