在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子句的需要。我的答案的主要目的是避免重复。
谢谢!
答案 0 :(得分:3)
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;