MySQL查询将分隔字符串值拆分为单独的列[重复]

Posted

技术标签:

【中文标题】MySQL查询将分隔字符串值拆分为单独的列[重复]【英文标题】:MySQL Query to split out Delimited String values to Separate Columns [duplicate] 【发布时间】: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 ;

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

【问题讨论】:

【参考方案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)

以上是关于MySQL查询将分隔字符串值拆分为单独的列[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将字符串拆分为新列[重复]

根据值的数量将熊猫列拆分为多个单独的列[重复]

将分隔列拆分为另一个表中的单独行的高效查询

将逗号分隔的字符串拆分为mysql中的行

将逗号分隔值拆分为 Oracle 中的列

如何拆分对象列表以分隔pyspark数据框中的列