2014-12-03 117 views
0

我希望能夠做到這一點,返回列表中的第一個非NULL值,或者如果沒有NULL值非NULL值。我對Oracle數據庫使用了Oracle SQL。返回列表中的第一個非NULL值,如果沒有非NULL值,則返回NULL

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和邁克對項目X和Null值匹配,因爲你看到的項目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有匹配,null值從結果集中消失,但由於Jay沒有匹配,所以Null值保持不變。

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

SQL表和結果集本質上是無序的。 「第一」是什麼意思? – 2014-12-03 14:29:04

+0

我只想返回一個結果,但我希望能夠返回匹配的項目(如果有),並且如果沒有匹配的項目比空值 – dc4teg 2014-12-03 14:41:32

+0

最初不計算爲NULL的第一個表達式。 – dc4teg 2014-12-03 14:47:03

回答

1

我懷疑你可以得到你想要使用的是什麼聚合:

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; 

這將返回非NULL值,如果有一個。

編輯:

如果你想在上面的查詢,以消除空值的客戶,那麼你可以調整它爲:

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; 
+0

這是返回一個空值和一個匹配的非空值,因爲沿着422的標記可能與項目X和B有關,在這種情況下,我只希望它向我顯示匹配的非空X,並且如果存在則返回null沒有其他比賽。類似於這裏解釋的但是爲SQL Oracle編寫的。 [http://msdn.microsoft.com/en-us/library/ms190349.aspx](http://msdn.microsoft.com/en-us/library/ms190349.aspx) – dc4teg 2014-12-03 14:43:54

+0

你可以看看我的編輯上面的帖子,並告訴我什麼是錯誤的,因爲我不能運行該聲明? – dc4teg 2014-12-03 15:15:38

+0

@ dc4teg。 。 。你遇到了什麼錯誤? – 2014-12-03 16:16:34