【问题标题】:Function resembling the work of Explode in MySQLMySQL 中类似 Explode 工作的函数
【发布时间】:2012-04-03 08:18:20
【问题描述】:

MySQL 中是否有任何函数可以分解列的数据然后检索它? 比如如果一列数据是 P:12 ,那么数据可以在 ':' 上展开然后读取吗?

【问题讨论】:

  • 之前好像有人问过这个问题:stackoverflow.com/questions/471914/…
  • 不是您的问题的答案,但您应该始终尝试在任何一个字段/记录中只保留一条数据。在这种情况下,如何将 P 与 12 分开存储?

标签: php mysql explode


【解决方案1】:

这里有很多关于mysql中SPLIT问题的讨论:

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

【讨论】:

    【解决方案2】:

    你可以在 MYSQL 中写一个 Split 函数检查这个link

    来自链接

    CREATE FUNCTION SPLIT_STR(
      x VARCHAR(255),
      delim VARCHAR(12),
      pos INT
    )
    
    RETURNS VARCHAR(255)
    RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
           LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
           delim, '');
    

    用法

    SELECT SPLIT_STR(string, delimiter, position)
    

    例子

    SELECT SPLIT_STR('a|bb|ccc|dd', '|', 3) as third;
    
    +-------+
    | third |
    +-------+
    | ccc   |
    +-------+
    

    【讨论】:

      【解决方案3】:

      我使用 while 循环解析字符串并将拆分项插入到临时表中。这很复杂,但我复制并粘贴代码,然后更改表名以提高可读性。这是一个将逗号分隔的用户 ID 列表解析为临时表的示例:

      CREATE PROCEDURE spParse
      (_UserList MEDIUMTEXT)
      BEGIN
          DECLARE _Pos INT;
          DECLARE _Start INT;
          DECLARE _Item INT;
          DECLARE _Length INT;
      
          CREATE TEMPORARY TABLE IF NOT EXISTS TempUserList
          (
              UserID INT
          );
      
          SET _Length = LENGTH(_UserList);
          SET _Pos = 1;
          SET _Start = 1;
          divide_loop:LOOP
              IF _Pos > _Length Then
                  LEAVE divide_loop;
              End If;
              IF SUBSTRING(_UserList,_Pos,1) = ',' Then
                  IF _Pos - _Start > 0 Then
                      IF IsNumeric(SUBSTRING(_UserList,_Start,_Pos-_Start)) Then
                          SET _Item = CONVERT(SUBSTRING(_UserList,_Start,_Pos-_Start),Signed);
                          INSERT INTO TempUserList (UserID)
                          VALUES (_Item);
                      End If;                 
                  End If;
                  SET _Start = _Pos + 1;
              End If;
              SET _Pos = _Pos + 1;
          END LOOP divide_loop;
          IF _Start <= _Length Then
              If IsNumeric(SUBSTRING(_UserList,_Start,_Length - _Start + 1)) Then
                  SET _Item = CONVERT(SUBSTRING(_UserList,_Start,_Length - _Start + 1),Signed);       
                  INSERT INTO TempUserList (UserID)
                  VALUES (_Item);
              End If;
          End If;
      
          SELECT UserID FROM TempUserList;
      
          DROP TABLE TempUserList;
      END
      

      【讨论】:

        猜你喜欢
        • 2017-11-18
        • 2019-12-22
        • 2020-02-03
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多