如何在MySQL中组合互斥列

时间:2016-06-13 07:19:41

标签: mysql sql

我有一个包含多个互斥列的数据库(不要问我为什么,有人像这样创建它。叹息)。下面是一个例子。

-------------------------------------------
| ID | BLACK | WHITE | RED | GREEN | BLUE |
-------------------------------------------
| 1  | 1     | 0     | 0   | 0     | 0    |
-------------------------------------------
| 2  | 0     | 0     | 1   | 0     | 0    |
-------------------------------------------
| 3  | 0     | 1     | 0   | 0     | 0    |
-------------------------------------------
你得到了这个想法,它包含了数千条记录。现在,我如何将它组合成一个" COLOR"柱。如下所示。

--------------
| ID | COLOR |
--------------
| 1  | BLACK |
--------------
| 2  | RED   |
--------------
| 3  | WHITE |
--------------

我现在能想到的就是做其中的5个

UPDATE table SET COLOR = 'BLACK' WHERE BLACK = 1

哦,我忘了提及,我目前正在处理的表包含至少 15个互斥列!有没有更简单的方法可以做到这一点?

修改
将颜色更改为颜色

3 个答案:

答案 0 :(得分:6)

使用case-expression,如此缩写示例所示:

update table
  set color= 
    case
      when black then "black"
      when red   then "red"
      when blue  then "blue"
    end;

这是sqlfiddle

答案 1 :(得分:2)

解决方案是:

创建一个包含三列(id int,color string,mutual string)的定义表,并将其命名为tbl_color,然后像这样填充此表:

--------------
| ID   | COLOR | mutual
--------------
| 101  | BLACK | 10000
--------------
| 102  | RED   | 00100
--------------
| 103  | WHITE | 01000
| 104  | green | 00010
| 105  | blue  | 00001
--------------

然后将表与此表连接并将结果插入新表:

Insert into new_table
Select t1.id,t2.color from old_table t1 join tbl_color t2
on(t2.mutual=concat(black,white,red,green,blue));

答案 2 :(得分:1)

使用ifs可以完成,有点难以阅读,可能有更好的解决方案,但这样可行......

UPDATE table SET COLOR =
   IF(BLACK=1,'BLACK',
       IF(WHITE=1,'WHITE',
           IF(RED=1,'RED',
               ...
           )
       )
   )