1

我有下表:

|-------------------|
| id | Homephone    |
|-------------------|
| 1  | 454454125    |
| 2  | 47872154587  |
| 3  | 128795423    |
| 4  | 148784474    |
|-------------------|

我在表中有大约 40.000 行。

我想将Homephone值格式化如下:

454-454-125 
478-721-545-87
128-795-423
148-784-474

即在我想要的每3个数字之后-(连字符)。
如何使用 MySQL 实现这一点?

4

2 回答 2

1

基本上,您需要创建自己的函数(所谓的UDF - 用户定义函数)并在表上运行它。
Andrew Hanna 在 MySQL Reference Manual 的String Functions章节中发布了一个不错的函数。我在那里修复了一个小错误(替换WHILE (i < str_len) DOWHILE (i <= str_len) DO.
有两个步骤(两个 SQL 查询):

  1. 创建函数。它有三个参数:str- 要修改pos的字符串, - 插入到字符串中的字符的位置, - 要插入的delimit字符:

    DELIMITER //
    CREATE FUNCTION insert_characters(str text, pos int, delimit varchar(124))
    RETURNS text
    DETERMINISTIC
    BEGIN
        DECLARE i INT DEFAULT 1;
        DECLARE str_len INT;
        DECLARE out_str text default '';
        SET str_len = length(str);
        WHILE (i <= str_len) DO
            SET out_str = CONCAT(out_str, SUBSTR(str, i, pos), delimit);
            SET i = i + pos; 
        END WHILE;
        -- trim delimiter from end of string
        SET out_str = TRIM(trailing delimit from out_str);
        RETURN(out_str);
    END//
    DELIMITER ;
    
  2. 运行函数...

    • ...用于测试目的(选择,无更新):

      SELECT insert_characters(Homephone, 3, "-") AS new_phone FROM my_table;
      
    • ...更新记录:

      UPDATE my_table SET Homephone = insert_characters(Homephone, 3, "-");
      

请尝试逐行分析函数。这个例子可以帮助你理解这个主题。

于 2012-07-07T12:43:31.323 回答
1

你需要为此写一个udf

于 2012-07-07T11:59:13.363 回答