MySQL - 拆分字符串

时间:2014-11-05 02:39:01

标签: mysql

我的问题类似于这篇文章: "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?

但我无法弄清楚如何获得我需要的输出。

1 个答案:

答案 0 :(得分:3)

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

第一个表结构:

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 | third_color    绿色| RED | BLACK 小提琴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