【问题标题】:MySQL - Split StringMySQL - 拆分字符串
【发布时间】:2015-01-01 03:38:37
【问题描述】:

我的问题与这篇文章类似: "Reverse GROUP_CONCAT" in MySQL?

但是,有没有办法像这样将字符串拆分成自己的列,而不是反转 group_concat

  id | colors1      | color 2      | color 3 | color 4
+----+-----------------------------+---------+----------
| 1  | Red          | Green        | Blue    | Black
| 2  | Orangered    | Periwinkle   | Black   |
| 3  | Orange       | Black        |         |

我也看过这篇文章: How to split the name string in mysql?

但我不知道如何获得所需的输出。

【问题讨论】:

  • 您在连接字段中有 4 种颜色还是可能更多或更少?
  • 每个id可以有4个或更少的颜色,一个id最多有4个颜色

标签: mysql


【解决方案1】:

这可能是您要查找的查询:

第一个表结构:

CREATE TABLE color (
  id int AUTO_INCREMENT,
  col_type varchar(255),
  PRIMARY KEY (id)
);
INSERT INTO color (col_type)
  VALUES(
         'GREEN,RED,BLACK'
);

SELECT
      SUBSTRING_INDEX(SUBSTRING_INDEX(col_type, ',', 1), ',', -1) AS first_color,
        If(  length(col_type) - length(replace(col_type, ',', ''))>1,  
             SUBSTRING_INDEX(SUBSTRING_INDEX(col_type, ',', 2), ',', -1) ,NULL) 
               as second_color,
             SUBSTRING_INDEX(SUBSTRING_INDEX(col_type, ',', 3), ',', -1) AS last_color
FROM color

结果如下 first_color | second_color |第三色 绿色 |红色 |黑色 小提琴enter link description here

但是对于超过 3 种颜色并且每种颜色按自己的顺序排列,我认为下面的查询是正确的。

SELECT
   COLOR,
   SUBSTRING_INDEX(SUBSTRING_INDEX(COLOR, ',', 1), ',', -1) AS first_color,
   If(  length(COLOR) - length(replace(COLOR, ',', ''))>=1,  
       SUBSTRING_INDEX(SUBSTRING_INDEX(COLOR, ',', 2), ',', -1) ,NULL) 
       as second_color,
   If(  length(COLOR) - length(replace(COLOR, ',', ''))>=2,  
       SUBSTRING_INDEX(SUBSTRING_INDEX(COLOR, ',', 3), ',', -1) ,NULL) 
       AS third_color,
   If(  length(COLOR) - length(replace(COLOR, ',', ''))>=3,  
       SUBSTRING_INDEX(SUBSTRING_INDEX(COLOR, ',', 4), ',', -1) ,NULL) 
       AS fourth_color
FROM COLOR;

要知道您可以在 COLOR 字段中发生的最大连接数

select (length(COLOR) - length(replace(COLOR, ',', '')) as NumColors

然后使用循环根据表中颜色的最大数量进行查询的if部分。 小提琴here

【讨论】:

  • 当我在我的数据集上测试它时,发生了这样的事情:因为那些只有一种颜色 --> 第一列和第三列填充了相同的值,第二列为空;对于有 2 种颜色的那些 --> 第一列填充第一种颜色,第二列为空,第三列填充第二种颜色;对于那些有 3 种颜色的,工作正常。我将很快添加一个小提琴链接以进行复制。
  • 我不知道如何选择第四种颜色
  • @PerriMa 我修改了查询以得到你想要的结果。
猜你喜欢
  • 1970-01-01
  • 2011-09-03
  • 2014-02-18
  • 2011-04-24
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
相关资源
最近更新 更多