Oracle SQL将两列合并为一个没有UNION的列

时间:2017-02-21 08:59:26

标签: sql oracle

在ORACLE 11G中,我有一个带有这种输出的SELECT:

COL_A       COL_B
-------     -------
BCS         (null)
(null)      FFG
VKD         FIU
...

我想得到这个:

MY_ALIAS
---------
BCD
FFG
VKD
FIU
...

COL_A和COL_B来自同一张桌子。查询有点复杂。

正如您所看到的,有3种类型的行:COL_A带有值,COL_B为null,oposite和最后两列都带有值。

我知道这可以用UNION这样做:

SELECT MY_ALIAS FROM (

    SELECT (COL_A) AS MY_ALIAS
    WHERE <lots of conditions here>
        AND COL_A IS NOT NULL
    UNION
    SELECT (COL_B) AS MY_ALIAS
    WHERE <lots of conditions here>
        AND COL_B IS NOT NULL
)

这样WHERE子句中的条件就完全相同了,我想避免它。

有没有办法实现这一点而不重复,没有PL / SQL,只是一个SELECT查询?

编辑以消除避免UNION子句的需要。我的答案的主要目的是避免重复。

谢谢!

3 个答案:

答案 0 :(得分:3)

您可以尝试使用UNPIVOT FUNCTION

SELECT 
   MY_ALIAS 
FROM 
(
    SELECT COL_A, COL_B AS MY_ALIAS
    WHERE <lots of conditions here>
) T UNPIVOT (MY_ALIAS FOR COL IN (COL_A, COL_B))

答案 1 :(得分:2)

首先在所有具有所需列的记录上加上UNION ALL,并在where子句中添加所需的所有列。然后得到不同的值。

select distinct mycol
from
(
  select col_a as mycol, col_a, col_b, col_c from mytable
  union all
  select col_b as mycol, col_a, col_b, col_c from mytable
) data
where <lots of conditions here>;

答案 2 :(得分:1)

使用WITH子句来应用您的条件:

with filtered as
(
  select col_a, col_b from mytable where <lots of conditions here>
)
select col_a from filtered
union
select col_b from filtered;
相关问题