Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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 返回列表中的第一个非NULL值,如果没有非NULL值,则返回NULL_Sql_Oracle - Fatal编程技术网

Sql 返回列表中的第一个非NULL值,如果没有非NULL值,则返回NULL

Sql 返回列表中的第一个非NULL值,如果没有非NULL值,则返回NULL,sql,oracle,Sql,Oracle,我希望能够做到这一点,返回列表中的第一个非NULL值,如果没有非NULL值,则返回NULL。我正在对Oracle数据库使用Oracle SQL SELECT a.customer, a.item, b.item, FROM Orders a LEFT JOIN item_desc c ON a.item= c.tag1 OR a.item= c.tag2 OR a.item= c.tag3 O

我希望能够做到这一点,返回列表中的第一个非NULL值,如果没有非NULL值,则返回NULL。我正在对Oracle数据库使用Oracle SQL

SELECT
    a.customer,
    a.item,
    b.item,
FROM
    Orders a
        LEFT JOIN
        item_desc c
        ON
    a.item= c.tag1 OR
    a.item= c.tag2 OR
    a.item= c.tag3 OR
    a.item= c.tag4 OR
    a.item= c.tag5
        LEFT JOIN
        Orders b
        ON
        c.item = b.item AND
    a.customer = b.customer
WHERE
    a.itemLIKE 'CP%'
GROUP BY
    a.customer,
    a.item,
    b.item;
我查询的目的是确保客户拥有主项目,而不仅仅是购买的随附项目,而且可能存在属于多个项目的随附项目。您将在下面看到Jon和Mike如何匹配项目X和空值,因为您看到项目422是项目X和B的随附项目。 结果如下所示:

Customer    Item    Item
Jon         422     X
Jon         424     NULL
Mike        424     X
Mike        422     Null
Jay         422     Null
Dan         422     B
Dan         422     Null
我查询的目的是确保客户购买的商品具有所需的标签,但可能存在属于多个商品的标签

我希望结果是这样的:因为Jon和Mike有一个匹配项,所以空值从结果集中消失,但是因为Jay没有匹配项,所以空值保持不变

Customer    Item    Item
Jon         422     X
Mike        424     X
Jay         422     Null
Dan         422     B

我怀疑您可以使用聚合获得您想要的:

SELECT a.customer, a.item, max(b.item)
FROM Orders a LEFT JOIN
     item_desc c
     ON a.item in (c.tag1, c.tag2, c.tag3, c.tag4, c.tag5) LEFT JOIN
     Orders b
     ON c.item = b.item AND
        a.customer = b.customer
WHEREa.item LIKE 'CP%'
GROUP BY a.customer, a.item;
如果存在非空值,则返回非空值

编辑:

如果希望上述查询消除客户的空值,则可以将其调整为:

SELECT customer, item, bitem
FROM (SELECT a.customer, a.item, max(b.item) as bitem,
             row_number() over (partition by a.customer order by (case when a.item is not null then 1 else 2 end) ) as seqnum
      FROM Orders a LEFT JOIN
           item_desc c
           ON a.item in (c.tag1, c.tag2, c.tag3, c.tag4, c.tag5) LEFT JOIN
           Orders b
           ON c.item = b.item AND
              a.customer = b.customer
      WHERE a.item LIKE 'CP%'
      GROUP BY a.customer, a.item
     ) t
WHERE bitem is not null or seqnum = 1;

SQL表和结果集本质上是无序的。“first”是什么意思?我只想返回一个结果,但如果有匹配项,并且如果没有匹配项,我希望能够返回匹配项,而不是初始值不为null的null-valuefirst表达式。这将同时返回null值和匹配的非null值,因为标记422可能与项X和B一起,在这种情况下,我只希望它向我显示匹配的非null X,如果没有其他匹配项,则只显示null。与本文所解释的内容类似,但是为SQL Oracle编写的。你能看看我上面的编辑帖子,告诉我哪里出了问题,因为我不能运行语句吗?@dc4teg。首先给
BLSEIT
一个别名,并对所有列使用限定名。当我从查询中删除“row_number()over(partition by a.SERPEX | | | a.SERPLN order by(case When b.SERITM not null then 1 else 2 end))作为seqnum”时,它可以正常工作,但这是我需要它在SERPEX中指出错误的部分