2017-06-02 39 views
0

我有一个表像这样MySQL数据库清洗使用存储功能,程序

CREATE TABLE `test` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `tel_1` text, 
    `tel_2` text, 
    `tel_3` text, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

+----+------------------------------------+-----------------------------------------------+-------+ 
| id | tel_1        | tel_2           | tel_3 | 
+----+------------------------------------+-----------------------------------------------+-------+ 
| 1 | 123-412-3455      | 1276ー364739−181     | NULL | 
| 2 | 714-212-3839 Not Using    | No Info          | NULL | 
| 3 | 12+13E        | NULL           | NULL | 
| 4 | 0123ー3432-1233 Ext : 602  | NULL           | NULL | 
+----+------------------------------------+-----------------------------------------------+-------+ 

而且我想清理数据像下面这样:

+----+--------------+------------+---------------+------------+-------+------------+ 
| id | tel_1  | tel_1_desc | tel_2   | tel_2_desc | tel_3 | tel_3_desc | 
+----+--------------+------------+---------------+------------+-------+------------+ 
| 1 | 1234123455 | NULL  | 1276364739181 | NULL  | NULL | NULL  | 
| 2 | 7142123839 | Not Using | NULL   | No Info | NULL | NULL  | 
| 3 | 12+13E  | NULL  | NULL   | NULL  | NULL | NULL  | 
| 4 || Ext : 602 | NULL   | NULL  | NULL | NULL  | 
+----+--------------+------------+---------------+------------+-------+------------+ 

这里是什么名单我需要:

  1. 删除字符从tel_X,大多是 ' - '
  2. 留下额外COM彪在tel_X_desc
  3. 做不是UTF-8号到正确的格式,从“0123”到 “0123”

我设法到MySQL创建存储功能#3,但我不能LOOP这个为每个记录和更新......

CREATE FUNCTION `multibyte2cv`(`str` TEXT) RETURNS text CHARSET utf8 
BEGIN 
    DECLARE int_len INT(2); 
    DECLARE int_z VARCHAR(10) DEFAULT '1234567890'; 
    DECLARE int_h VARCHAR(10) DEFAULT '1234567890'; 

    SET int_len = CHAR_LENGTH(int_z); 
    WHILE int_len > 0 DO 
     SET str = REPLACE(str, SUBSTRING(int_z,int_len,1), SUBSTRING(int_h,int_len,1)); 
     SET int_len = int_len - 1; 
    END WHILE; 
    RETURN str; 
END; 

我非常新的数据库字段,并试图找到的东西,我可以解决这个问题....

+0

是否有可能在插入的时候检查它是否不必清理,但在插入时保持顺序?从设计角度来看,这将更容易.. – inetphantom

+1

其他想法是做一个女巫[游标](https://dev.mysql.com/doc/refman/5.7/en/cursors.html),但优先barmars更新 – inetphantom

+0

是的,我做了一些研究,游标和取指可以使用。我可以在另一个功能或程序中使用功能吗? – Kazuaki

回答

1

呼叫在UPDATE查询功能:

UPDATE test 
SET tel_1 = multibyte2cv(tel_1), tel_2 = multibyte2cv(tel_2), tel_3 = multibyte2cv(tel_3) 
+0

谢谢,它在#3上工作,但仍然需要做#1和#2。我想为他们创建另一个函数并运行相同的代码会更容易。 – Kazuaki

+0

您可以使用'REPLACE()'函数删除特定的字符,如'-'。不幸的是,除了一定的范围外,没有内置的功能来移除所有的字符。尽管如此,您可以搜索一个对此很有用的REGEXP_REPLACE()UDF。 – Barmar