Oracle SQL - 从两列中选择并合并为一列

时间:2012-06-25 23:50:51

标签: sql oracle select

我有这张桌子:

Vals
Val1  Val2  Score
A     B     1 
C           2
      D     3

我希望输出是一个单独的列,它是Vals1和Val2变量的“超集”。它还保持与该值相关联的“得分”变量。

输出应为:

Val Score
A   1
B   1
C   2
D   3

从这张表中选择两次然后联合是绝对不可能的,因为生产它非常昂贵。另外我不能使用with子句,因为这个查询在子查询中使用了一个,并且由于某种原因,Oracle不支持两个带子句。

我并不关心如何处理重复值,无论最简单/最快。

如何生成适当的输出?

3 个答案:

答案 0 :(得分:9)

这是不使用unpivot的解决方案。

with columns as (
  select level as colNum from dual connect by level <= 2
),
results as (
  select case colNum
              when 1 then Val1
              when 2 then Val2
            end Val,
         score
    from vals,
         columns
)
select * from results where val is not null

这里基本上是没有WITH子句的相同查询:

select case colNum
            when 1 then Val1
            when 2 then Val2
         end Val,
       score
  from vals,
       (select level as colNum from dual connect by level <= 2) columns
 where case colNum
            when 1 then Val1
            when 2 then Val2
         end is not null

或者更简洁一点

select *
  from ( select case colNum
                     when 1 then Val1
                     when 2 then Val2
                  end Val,
                score
           from vals,
                (select level as colNum from dual connect by level <= 2) columns
        ) results
 where val is not null

答案 1 :(得分:1)

试试这个,看起来想要将列值转换为行

select val1, score from vals where val1 is not null
union 
select val2,score from vals where val2 is not null

答案 2 :(得分:1)

如果您使用的是Oracle 11,则unPivot会提供帮助:

SELECT *
  FROM vals
UNPIVOT ( val FOR origin IN (val1, val2) )

你可以选择任何名字而不是'val'和'origin'。

请参阅Oracle article on pivot / unPivot