Reputation: 4157
I have a table with 3 values:
id | name | v1 | v2 | v3
---+------+------+------+---
1 | John | 6 | null | 7
2 | Jack | null | 5 | 9
Is there a simple way to get the different values from v1
, v2
and v3
each on it's own row, preferably without the null's
? So the result would be:
id | name | value
---+------+------
1 | John | 6
1 | John | 7
2 | Jack | 5
2 | Jack | 9
The only query I came up with is one with 3 subqueries, so maybe there is a better way to do this:
SELECT id, name, value
FROM (
(SELECT id, name, v1 value FROM table WHERE v1 IS NOT NULL)
UNION ALL
(SELECT id, name, v2 value FROM table WHERE v2 IS NOT NULL)
UNION ALL
(SELECT id, name, v3 value FROM table WHERE v3 IS NOT NULL)
) V
GROUP BY id, name, value
Upvotes: 2
Views: 27
Reputation: 33945
Obviously, if you start with a table design like this, then the problem becomes trivial...
| id | v_id | value |
+----+------+-------+
| 1 | 1 | 6 |
| 1 | 3 | 7 |
| 2 | 2 | 5 |
| 2 | 3 | 9 |
Upvotes: 0
Reputation: 37473
you don't need subquery and group by - just UNION ALL is enough
SELECT id, name, v1 value FROM table WHERE v1 IS NOT NULL
UNION ALL
SELECT id, name, v2 value FROM table WHERE v2 IS NOT NULL
UNION ALL
SELECT id, name, v3 value FROM table WHERE v3 IS NOT NULL
Upvotes: 1