【问题标题】:Split delimited string value into rows将分隔的字符串值拆分为行
【发布时间】:2013-08-19 00:05:03
【问题描述】:

一些外部数据供应商想给我一个数据字段 - 管道分隔的字符串值,我觉得这很难处理。

如果没有应用程序编程语言的帮助,有没有办法将字符串值转换为行?

但是有一个困难,该字段有未知数量的分隔元素。

有问题的数据库引擎是 MySQL。

例如:

Input: Tuple(1, "a|b|c")

Output:

Tuple(1, "a")
Tuple(1, "b")
Tuple(1, "c")

【问题讨论】:

  • Can Mysql Split a column?的可能重复
  • @YuriyGalanter 不是重复的。我的问题要求进行数据转换,而不是数据提取。
  • 同样的事情 - 拆分字符串。将结果插入表中,这是许多 SQL 方言中的常见任务。只需谷歌“MySQL 拆分字符串”
  • 看,如果事先知道分隔值的数量,那肯定不难。但就我而言,这个数字是未知的。
  • 项目数无关紧要。看看那个 SO 答案中提到的blog.fedecarg.com/2009/02/22/mysql-split-string-function 的例子。它采用具有 任意 个元素的字符串。这只是一个例子,如果它不适合你——还有很多其他的。例如。您可能需要一个返回表的函数,您可以从中进行 SELECT 以将拆分数据插入到您自己的表中。

标签: mysql sql database delimiter


【解决方案1】:

这可能没有我最初想的那么难。

这是一种通用方法:

  1. 统计分隔符length(val) - length(replace(val, '|', ''))的出现次数
  2. 循环多次,每次获取一个新的分隔值并将该值插入到第二个表中。

【讨论】:

    【解决方案2】:

    Federico Cargnelutti使用此功能:

     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)
    

    你需要一个循环来解决你的问题。

    【讨论】:

      【解决方案3】:

      虽然您的问题可能已经解决了很长时间,但我一直在寻找解决您遇到的同样问题的方法。我在 procedure referenced here 的帮助下解决了这个问题,并通过使用 CHAR_LENGTH() 而不是 LENGTH() 对字符串中的多字节字符(例如德语变音符号)进行了微调。

      DELIMITER $$
          CREATE FUNCTION SPLIT_STRING(val TEXT, delim VARCHAR(12), pos INT) RETURNS TEXT
          BEGIN
              DECLARE output TEXT;
              SET output = REPLACE(SUBSTRING(SUBSTRING_INDEX(val, delim, pos), CHAR_LENGTH(SUBSTRING_INDEX(val, delim, pos - 1)) + 1), delim, '');
              IF output = '' THEN
                  SET output = null;
              END IF;
              RETURN output;
          END $$
      
          CREATE PROCEDURE TRANSFER_CELL()
          BEGIN
              DECLARE i INTEGER;
              SET i = 1;
              REPEAT
                  INSERT INTO NewTuple (id, value)
                  SELECT id, SPLIT_STRING(value, '|', i)
                  FROM Tuple
                  WHERE SPLIT_STRING(value, '|', i) IS NOT NULL;
                  SET i = i + 1;
              UNTIL ROW_COUNT() = 0
              END REPEAT;
          END $$
      DELIMITER ;
      
      CALL TRANSFER_CELL() ;
      
      DROP FUNCTION SPLIT_STRING ;
      DROP PROCEDURE TRANSFER_CELL ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-02
        • 1970-01-01
        相关资源
        最近更新 更多