2017-06-02 86 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