oracle - 返回列表中第一个非空值,如果没有空值,则返回 NULL

  显示原文与译文双语对照的内容
0 0

我希望能够这样做,返回列表中的第一个非空值,如果没有空值,则返回 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;

my查询是make客户在项目X 标签X MATCH 和空值,因为你看到项目 422是标签,它是项目的标签,而非标签。 结果如下所示:

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有一个 MATCH 值从结果集中消失,但是由于Jay没有 MATCH,空值保持不变。

Customer Item Item
Jon 422 X
Mike 424 X
Jay 422 Null
Dan 422 B
时间:原作者:4个回答

0 0

我怀疑你可以使用聚合获得所需的内容:

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;
原作者:
...