mariadb 在每次出现模式时拆分列值,并将其放在MySQL中的多行中

ar5n3qh5  于 2022-11-08  发布在  Mysql
关注(0)|答案(2)|浏览(120)

我不得不在MySQL表中的每一个出现的模式,如“:“和“”,将一列拆分成多行。以下是列数据的外观:

Column_1
  page1:message1,page2:message2,page3:message3,page4:message4

我想显示这样的数据:-

Column_2  Column_1
page1     message1
page2     message2
page3     message3
page4     message4

我已经尝试寻找REGEXP_REPLACE()和SUBSTRING_INDEX()MySQL函数,但无法形成一个查询来实现这一点。
谁来帮帮忙。

bvjveswy

bvjveswy1#

如果您的MySQL版本不支持windows函数,您可以创建一个数字表(使用您的字符串的最大长度),如下所示:

create table numbers (
  nr int
);

insert into numbers values (1),(2),(3),(4),(5);

然后遵循两个步骤的过程。
首先,用逗号分隔字符串:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(col1, ',', nr),',', -1) AS new_col1        
FROM test t
JOIN numbers n ON CHAR_LENGTH(col1) - CHAR_LENGTH(REPLACE(col1, ',', '')) >= nr - 1

你会得到这样一个结果:

new_col1
page1:message1
page2:message2
page3:message3
page4:message4

其次,使用:划分行,如下所示:

select SUBSTRING_INDEX(new_col1,':',1) as page,
       SUBSTRING_INDEX(new_col1,':',-1) as message
from (   SELECT  SUBSTRING_INDEX(SUBSTRING_INDEX(col1, ',', nr),',', -1) AS new_col1        
         FROM test 
         JOIN numbers n ON CHAR_LENGTH(col1) - CHAR_LENGTH(REPLACE(col1, ',', '')) >= nr - 1 
  ) as t2;

最终结果:

page  message
page1 message1
page2 message2
page3 message3
page4 message4

https://dbfiddle.uk/acWncQ8y

5lhxktic

5lhxktic2#

您可以使用cte为每次出现的带有索引的行获取一行

WITH RECURSIVE expand (column1, n) AS (
select column1, 1 from
   (select
     'page1:message1,page2:message2,page3:message3,page4:message4' as column1) as 
      table1
      UNION ALL
      select column1 , n+1 from expand where n < CHAR_LENGTH(column1) - 
        CHAR_LENGTH(REPLACE(column1,',',''))
    )

这将为您提供如下结果

column1                                                        n
page1:message1,page2:message2,page3:message3,page4:message4    1
page1:message1,page2:message2,page3:message3,page4:message4    2
page1:message1,page2:message2,page3:message3,page4:message4    3

这样,您现在就可以获取以分隔的部分的第n个示例,并将该部分拆分为两列

Select 
 SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(column1,',',n),',',-1),':',1) as page,
 SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(column1,',',n),',',-1),':',-1) 
 as message from expand

然后你会得到

page    message
page1   message1
page2   message2
page3   message3

相关问题