2016-06-13 94 views
4

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

------------------------------------------- 
| 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 | 
-------------- 

所有我现在能想到的就是做这些

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

哦,我忘了提5,我目前的工作表中包含至少 15个互斥列!有没有更简单的方法可以做到这一点?

编辑
换了颜色颜色

+0

确定一个ID只能有一种颜色?你称之为“COLORS”这一列似乎表明不止一种是可能的。 –

+0

oops。抱歉。它假设是COLOR ..哈哈..在那里感到困惑。 –

+1

如果有任何问题需要正常化。 – Strawberry

回答

6

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

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

这里有一个sqlfiddle

1

使用IFS可以做到的,这是一个有点难以阅读,有可能是一个更好的解决方案,但会工作......

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

一种解决方案是:

创建一个定义表有三列(ID INT,颜色字符串,相互串),并将其命名为tbl_color然后manualy填写此表是这样的:

-------------- 
| 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));