【问题标题】:How to get Distinct value for a column on the basis of other column in Oracle如何根据Oracle中的其他列获取列的不同值
【发布时间】:2019-05-17 09:17:24
【问题描述】:

我想从 COL1 中获取不同的值,它也是 COL3 值,但条件是如果 COL1 = COl2 那么它应该选择匹配的 COL3 值,否则如果它们不相同则选择 COL1 值。我被困在逻辑中,任何帮助将不胜感激!

详情请看下图:

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

【问题讨论】:

  • 添加行 (15, 16, 'ABC') 并调整结果(如果需要)。

标签: sql oracle


【解决方案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】:

    使用相关子查询

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

    【讨论】:

    • 这不包括没有匹配COL2值的情况......我认为
    • 将在上面的示例数据上工作,只是因为它有点差。如果您添加一些更棘手的行,将无法正常工作。
    【解决方案3】:
    select distinct COL1, if(COL1 = COL2, COL3, COL1) as result
    from table1
    

    【讨论】:

      【解决方案4】:

      我认为您可以自行加入表,然后使用连接条件将其过滤掉,然后在选择中决定是否存在 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 函数合并就是这样做的。

      【讨论】:

        【解决方案5】:

        使用自联接:

        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 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-06-10
          • 1970-01-01
          • 2016-12-22
          • 2021-09-27
          • 2021-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多