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
  /

[编辑] 回复评论:

如果你想保持并集,那很好,并集和 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
  /

如果您只想在 1 个地方使用 NULL 条件;) 同样的逻辑可以适用于我在上面使用 row_number() analytics 编写的第二个查询 ...

  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;