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

时间: 原作者:

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;

原作者:
...