Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle中的unionnull_Sql_Oracle_Union - Fatal编程技术网

Sql Oracle中的unionnull

Sql Oracle中的unionnull,sql,oracle,union,Sql,Oracle,Union,我试图在oracle中组合两个查询,除了一个字段外,这些行具有相同的值 例: 结果: 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 多谢各位 (对不起,我的英语…)如果您只是

我试图在oracle中组合两个查询,除了一个字段外,这些行具有相同的值

例:

结果:

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
多谢各位
(对不起,我的英语…)

如果您只是试图忽略空值:

  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
  /
[编辑] 针对评论:

如果您想保持union,这很好,union和OR基本上可以互换(在本例中):

甚至:

  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位;) 同样的逻辑也可以应用于我上面使用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'

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

您可以使用COALESCE()

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

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;

如果标志为1,则日期是否始终为空?为什么不仅使用标志为0的数据行?你为什么需要另一排?同上。。。不幸的是,我需要使用2选择在这种情况下。。。我使用的系统可以让我设置2个选择,他将创建联合…=/这是一个大问题,但谢谢你的帮助。好的,但以上哪一项是正确的?是否要忽略所有空值?或者只是喜欢非空而不是空。。。如果只有空值,就使用空值?在这种情况下(ex),我真的需要使用2个选择。。我在工作中使用的系统是一个¨%#$,因为他将其标记为Oracle,这可能有助于指向Oracle文档,而不是SQL server文档;):(在本例中,它们是相同的,所以“meh”):)工作正常!!非常感谢你!
WHERE NAME = 'JOAO' AND FLAG = '0'
WHERE NAME = 'JOAO' AND FLAG IN('0','1')
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;