如何在MySQL中合并行?

时间:2016-05-24 16:06:54

标签: mysql sql

我有一张这样的表:

// colors
+----+-------+--------+----------+---------+
| id | type  | red_id | green_id | blue_id |
+----+-------+--------+----------+---------+
| 1  | 1     | 51     | NULL     | NULL    |
| 2  | 3     | NULL   | NULL     | 12      |
| 3  | 1     | 423    | NULL     | NULL    |
| 4  | 2     | NULL   | 5432     | NULL    |
| 5  | 2     | NULL   | 10       | NULL    |
+----+-------+--------+----------+---------+
//     ^ type: there is either 1 or 2 or 3 which specifies which color isn't NULL

我想要这个输出:

// new_colors
+----+-------+----------+
| id | type  | color_id |
+----+-------+----------+
| 1  | 1     | 51       |
| 2  | 3     | 12       |
| 3  | 1     | 423      |
| 4  | 2     | 5432     |
| 5  | 2     | 10       |
+----+-------+----------+

我想我必须使用CASE .. WHEN函数。

SELECT id, type,
         CASE WHEN red_id IS NOT NULL THEN red_id
              WHEN green_id IS NOT NULL THEN green_id
              WHEN blut_id IS NOT NULL THEN blue_id
         END AS color_id
  FROM colors
WHERE 1

但我正在尝试根据type列编写查询。我想在1列中使用这三个数字23type中的一个而不是CASE .. WHEN。那可能吗?

4 个答案:

答案 0 :(得分:4)

你想在mysql中使用COALESCE函数。 Coalesce函数返回传递给此函数的列列表中的第一个非null值作为参数。

select id, type,coalesce(red_id,green_id,blue_id) as color_id from colors

答案 1 :(得分:4)

您的表格为bad design。如果您有type列,则只需要value列,而不是3列。

对于您的情况,如果只有1列不是null,则2是null,那么您可以使用

SELECT id, type,
     COALESCE(red_id, green_id, blue_id)
FROM colors;

答案 2 :(得分:2)

你已经知道该怎么做了。 一个简单的改变:

SELECT id, type,
         CASE WHEN (type = 1) THEN red_id
              WHEN (type = 2) THEN green_id
              WHEN (type = 3) THEN blue_id
         END AS color_id
  FROM colors
WHERE 1

答案 3 :(得分:1)

Haven未经测试,但这似乎是正确的: 将您的案例陈述更改为此*

CASE WHEN type = 1 THEN red_id
          WHEN type = 2 THEN green_id
          WHEN type = 3 THEN blue_id
     END AS color_id