【问题标题】:MySQL Query to split out Delimited String values to Separate Columns [duplicate]MySQL查询将分隔字符串值拆分为单独的列[重复]
【发布时间】:2021-03-16 17:48:21
【问题描述】:

作为迁移任务的一部分,我需要将星号分隔的字符串中的值拆分为不同的列。例如,给定这个字符串:

Case Western Reserve University* University of Kansasi*Middle East Tech

我想回来:

Uni1 Uni2 Uni3
Case Western Reserve University University of Kansasi Middle East Tech

字符串中可以有任意数量的分隔值,因此查询需要是动态的。

我正在研究的方法是使用存储过程来循环遍历字符串以有效地重新创建它:

SET @test = "Case Western Reserve University* University of Kansasi* Middle East Technical University";


SELECT SPLIT_STR (@test, '*',3) as third, SPLIT_STR (@test, '*',2) as second;

这是我目前所拥有的。这是一项正在进行的工作。它遍历分隔值并使用函数 (SPLIT_STR) 提取值,但在一个表格单元格中返回值。我无法将“as val1”添加到 @rval,因此它不会分成单独的列。

DELIMITER //

CREATE PROCEDURE SplitValuesIntoColumns ( delim_str VARCHAR(1000) )

BEGIN

   DECLARE i INT;
  
   SET i = 0;
  
   WHILE (i <= 2) DO
    SET i = i + 1;
        SET @rval =  concat(@rval,SPLIT_STR (delim_str, '*', 1));  
   END WHILE;
   
   SELECT @rval;


END; //

DELIMITER ;

任何帮助表示赞赏。这似乎冗长,所以如果有更好的方法来实现这一点,请加入。

【问题讨论】:

    标签: mysql sql stored-procedures


    【解决方案1】:

    SUBSTRING_INDEX(SUBSTRING_INDEX(column, '*', xxx), '*', -1)提取子串号xxx

    SET @test = "Case Western Reserve University* University of Kansasi* Middle East Technical University";
    
    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@test, '*', 1), '*', -1) first,
           SUBSTRING_INDEX(SUBSTRING_INDEX(@test, '*', 2), '*', -1) second,
           SUBSTRING_INDEX(SUBSTRING_INDEX(@test, '*', 3), '*', -1) third;
    

    如果输入的子串数量超过子串数量,那么最后返回的一些子串将是相同的。

    【讨论】:

    • 感谢您的回答,但解决方案必须是动态的。分隔字符串中可能有一个值或十个值。因此循环。
    • @user15409152 什么是精确 MySQL 版本?如果 8+ 则使用递归 CTE 并生成相应的数字表。在 5+ 中,在子查询中静态生成它。因此使用ON number &lt;= LENGTH(text) - LENGTH(REPLACE(text, '*', '') + 1)
    猜你喜欢
    • 2012-11-26
    • 2017-04-15
    相关资源
    最近更新 更多