如何在MySQL中合并互斥列

5

我有一个数据库,里面有多个互斥的列(不要问我为什么,是其他人创建的。 叹气)。以下是一个示例。

-------------------------------------------
| 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个互斥列!有没有更简单的方法可以做到这一点?

编辑
将COLORS更改为COLOR


你确定一个ID只能有一种颜色吗?你将列命名为“COLORS”似乎表明可能不止一种颜色。 - Jim Garrison
抱歉,应该是颜色(COLOR)...哈哈...我弄混了。 - alex_the_emperor
1
如果有一个问题正在呼唤规范化,那么这就是它了。 - Strawberry
3个回答

6

使用case-expression,就像这个简化的例子:

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

这是一个SQLFiddle网站链接,它涉及到IT技术。

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

1

虽然可以使用if语句,但它可能难以阅读。也许有更好的解决方案,但这会起作用...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接