如何在Oracle中的其他列的基础上获取列的唯一值

时间:2019-05-17 09:17:25

标签: sql oracle

我想从COL1中获得不同的值,它也是COL3的值,但条件是如果COL1 = COl2,则应选择匹配的COL3值,否则选择不相同的COL1值。我坚持逻辑,将不胜感激!

有关更多详细信息,请参见下图:

select  DISTINCT COL1, 
CASE WHEN COL1 = COL2 THEN COL3 END COL3 from TABLE1 
WHERE COL1 IS NOT NULL;

enter image description here

5 个答案:

答案 0 :(得分:1)

使用相关子查询

select col1,col3 
from TABLE1 a 
      where col2 in (select min(col2) from table1 b where a.col1=b.col1)

答案 1 :(得分:1)

执行GROUP BY以获得不同的COL1值。

如果存在COL1 = COL2行,请使用COALESCE()返回COL3值,否则返回COL1的最大COL3值。 (如果更好,也可以使用MIN()。)

select COL1,
       COALESCE( MAX(CASE WHEN COL1 = COL2 THEN COL3 END), MAX(COL3) )
FROM table1
WHERE COL1 IS NOT NULL
GROUP BY COL1

答案 2 :(得分:0)

我认为您可以将表与自身连接,然后使用连接条件将其过滤掉,然后选择是否存在COL2 = COL1并选择适当的COL3:

SELECT DISTINCT a.COL1, CASE WHEN b.COL1 IS NULL THEN a.COL3 ELSE b.COL3 END as COL3
FROM TABLE1 a
LEFT JOIN TBALE2 b
on a.COL1 = b.COL2 
and a.COL1 = b.COL1

这样,当且仅当COL1与COL2匹配时,您才在表a上拥有所有数据,在表b上拥有数据。然后,选择其中一个不为空的COL3,最好选择表b中的那个。 Oracle功能合并可以做到这一点。

答案 3 :(得分:0)

select distinct COL1, if(COL1 = COL2, COL3, COL1) as result
from table1

答案 4 :(得分:0)

使用自我加入:

select distinct
  t.col1,
  case 
    when tt.col1 is null then t.col3  
    else tt.col3 
  end col3  
from tablename t left join tablename tt
on tt.col1 = t.col1 and tt.col2 = t.col1

请参见demo
结果:

> COL1 | COL3
> ---: | :---
>   11 | ABC 
>   12 | ABC 
>   13 | BDG 
>   14 | DEF 
>   15 | CEG