sql >> データベース >  >> RDS >> Mysql

フィールドからすべての非数字文字を削除します

    MySQLでこの操作を行う「組み込み」関数はありません。

    1つのオプションは、独自のストアド関数を作成することです(データベースに対して十分な権限がある場合)。

     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 ;
    

    そして、必ずテストしてください 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
    

    返品:

     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
    

    (最後の2行は、私たちが本当に達成したいことを再考するために一時停止する可能性があります。それが私である場合、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. MySQLとPHPのCRUD

    2. 自動インクリメントの主キーを既存のテーブルに挿入します

    3. Neo4j-Cypherを使用して関係を作成する

    4. MySQLの列の一部の値に先行ゼロを追加する