Having this column structure
Id, col_1, col_2, col_3 1 A A B 2 B B B 3 C C D
Is it possible to get one-column output with unique values?
res_column A B C D
What I’ve already tried:
- Union seems doable only in case there are 2 to 3 columns, which is not the case.
- I’ve found a pivot/unpivot, but I didn’t really grasp it.
Advertisement
Answer
with sample_inputs (id, col_1, col_2, col_3) as ( select 1, 'A', 'A', 'B' from dual union all select 2, 'B', 'B', 'B' from dual union all select 3, 'C', 'C', 'D' from dual ) select distinct res_column from sample_inputs unpivot (res_column for col in (col_1, col_2, col_3)) order by res_column --- if needed ; RES_COLUMN ---------- A B C D
If you must handle null
also, you can do so with the include nulls
option to unpivot
. Without this option, the query above will still work – it will just ignore (discard, exclude) all null
from the unpivoted columns.
with sample_inputs (id, col_1, col_2, col_3) as ( select 1, 'A' , 'A' , 'B' from dual union all select 2, 'B' , 'B' , 'B' from dual union all select 3, 'C' , 'C' , 'D' from dual union all select 4, null, null, null from dual ) select distinct res_column from sample_inputs unpivot include nulls (res_column for col in (col_1, col_2, col_3)) order by res_column --- if needed ; RES_COLUMN ---------- A B C D (five rows selected)
Note that the last result has five rows, not four; the last value is null
, which is invisible, but if you run the query in an editor that shows you the number of rows (or if you use an option to show null
as <null>
or such), then you will see it.
NOTE: You can’t make this “generic” in plain SQL; the number of columns to unpivot, and their names, must be hard-coded in the query. If you need a “generic” solution you will need to use dynamic SQL; that is a much more advanced topic, and certainly not appropriate if you don’t even grasp static unpivot
yet.