A table contains both numeric and character values in a column. The numeric values and character values need to be separated in different columns
Col1 |
---|
1 |
2 |
3 |
A |
B |
C |
The output needs to be
col1 | col2 |
---|---|
1 | A |
2 | B |
3 | C |
Advertisement
Answer
You could do this using conditional aggregation:
select max(case when regexp_like(col1, '^[0-9]*$') then col1 end), max(case when not regexp_like(col1, '^[0-9]*$') then col1 end) from (select t.*, row_number() over (partition by (case when regexp_like(col1, '^[0-9]*$') then 1 else 0 end) order by col1 ) as seqnum from t ) t group by seqnum;
You cold simplify this a bit using a lateral join:
select max(case when is_number = 1 then col1 end), max(case when is_number = 0 then col1 end) from (select t.*, x.is_number row_number() over (partition by x.is_number order by col1 ) as seqnum from t cross join lateral (select (case when regexp_like(col1, '^[0-9]*$') then 1 else 0 end) as is_number from dual ) x ) t group by seqnum;