繁体   English   中英

Oracle中的Union null

[英]Union null in Oracle

我正在尝试在oracle中合并2个查询,这些行具有相同的值,但需要一个字段。

例如:

SELECT NAME, AGE, EMAIL, DATE FROM table_a WHERE NAME = 'JOAO' AND FLAG = '0'
UNION
SELECT NAME, AGE, EMAIL, DATE FROM table_a WHERE NAME = 'JOAO' AND FLAG = '1'

结果:

NAME   AGE   EMAIL      DATE   
JOAO   23    a@a.com    20150414
JOAO   23    a@a.com    null

我如何将这些行分组? 我正在寻找可以给我类似结果的东西:

NAME   AGE   EMAIL      DATE   
JOAO   23    a@a.com    20150414

谢谢你(抱歉我的英语..)

如果您只是想忽略NULL值:

  SELECT NAME, AGE, EMAIL, DATE 
    FROM table_a 
   WHERE NAME = 'JOAO' 
     AND FLAG in ( '0', '1' )
     and date is not null
  /

或者如果您想保留空值,但要遵循可用的非空值:

  with w_data as (
        SELECT NAME, AGE, EMAIL, DATE ,
               row_number() over ( partition by name
                             order by date desc nulls last ) rnum
          FROM table_a 
         WHERE NAME = 'JOAO' 
           AND FLAG in ( '0', '1' )
     )
  select name, age, email, date
    from w_data
   where rnum = 1
  /

[edit]回应评论:

如果您想保留联合,那很好,联合和OR大多可以互换(在这种情况下):

  SELECT NAME, AGE, EMAIL, DATE 
    FROM table_a 
   WHERE NAME = 'JOAO' 
     AND FLAG = '0'
     and date is not null
     union
  SELECT NAME, AGE, EMAIL, DATE 
    FROM table_a 
   WHERE NAME = 'JOAO' 
     AND FLAG = '1'
     and date is not null
  /

甚至:

  select * from (
  SELECT NAME, AGE, EMAIL, DATE 
    FROM table_a 
   WHERE NAME = 'JOAO' 
     AND FLAG = '0'
   union
  SELECT NAME, AGE, EMAIL, DATE 
    FROM table_a 
   WHERE NAME = 'JOAO' 
     AND FLAG = '1'
  )
  where date is not null
  /

如果您只想将NULL条件放在1个位置;)相同的逻辑可以应用于我上面使用row_number()分析编写的第二个查询...

  with w_data as (
     SELECT NAME, AGE, EMAIL, DATE 
       FROM table_a 
      WHERE NAME = 'JOAO' 
        AND FLAG = '0'
      union
     SELECT NAME, AGE, EMAIL, DATE 
       FROM table_a 
      WHERE NAME = 'JOAO' 
        AND FLAG = '1'
     ),
     w_sub as ( 
        select name, age, email, date,
              row_number() over ( partition by name
                             order by date desc nulls last ) rnum
          from w_data
       )
  select name, age, email, date
    from w_sub
   where rnum = 1
  /

在这种情况下,您可以在“ WHERE”子句中更改您的条件

WHERE NAME = 'JOAO' AND FLAG = '0'

WHERE NAME = 'JOAO' AND FLAG IN('0','1')

因此,您的选择将在“ FLAG”列中显示所有值为“ 0”或“ 1”的寄存器。

您可以使用COALESCE()。 http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions023.htm#SQLRF00617/ms190349.aspx

该查询应适用于每个名称,并应合并其他行。

SELECT 
    NAME1 AS NAME,
    COALESCE(AGE1, AGE2) AS AGE,
    COALESCE(EMAIL1, EMAIL2) AS EMAIL,
    COALESCE(DATE1, DATE2) AS DATE
FROM(
    SELECT 
        t1.NAME AS NAME1, 
        t1.AGE AS AGE1, 
        t1.EMAIL AS EMAIL1, 
        t1.DATE AS DATE1,
        t2.NAME AS NAME2, 
        t2.AGE AS AGE2, 
        t2.EMAIL AS EMAIL2, 
        t2.DATE AS DATE2 
    FROM table_a AS t1
    INNER JOIN table_a AS t2
    ON t2.FLAG = 1 AND t1.FLAG = 0 AND t1.NAME = t2.NAME
) AS t3;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM