我有一个包含多个互斥列的数据库(不要问我为什么,有人像这样创建它。叹息)。下面是一个例子。
-------------------------------------------
| 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个互斥列!有没有更简单的方法可以做到这一点?
修改
将颜色更改为颜色
答案 0 :(得分:6)
使用case-expression
,如此缩写示例所示:
update table
set color=
case
when black then "black"
when red then "red"
when blue then "blue"
end;
答案 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',
...
)
)
)