2017-06-01 62 views
2

我有這個表:的Oracle SQL - 保持空值,如果它是唯一一個,否則避免空值

Table1 
----------------- 
ID   VAL  
----------------- 
1   A 
1   B 
1   null 
2   null 
3   B 
3   null 
4   B 
4   C 
5   null 

我想要得到這樣的結果:

如果唯一的價值爲null,則返回空,否則返回非空 值

Table1 
----------------- 
ID   VAL  
----------------- 
1   A 
1   B 
2   null 
3   B 
4   B 
4   C 
5   null 

我使用過的分區通過一個案例嘗試,但我的發言成了幾個子查詢太複雜了,如果覺得應該有一個簡單的方法來做到這一點。

+0

有沒有聽說過NVL? – hamzox

回答

3

COUNT(value) OVER (PARTITION BY id)解析函數將計算行,其中value並非是─NULL每個id。你可以用它來過濾這樣的行:

SELECT id, value 
FROM (
    SELECT t.*, 
     COUNT(value) OVER (PARTITION BY id) AS num_values 
    FROM yourtable t 
) 
WHERE value IS NOT NULL 
OR  num_values = 0; 

如果唯一的價值爲null,則返回null,否則返回非NULL值

如果你想確保NULL只如果id確切有一行,則返回:

SELECT id, value 
FROM (
    SELECT t.*, 
     COUNT(*) OVER (PARTITION BY id) AS num_rows 
    FROM yourtable t 
) 
WHERE value IS NOT NULL 
OR  num_rows = 1; 
+0

完美,謝謝! – baboufight

0

試試這個:

SELECT * 
FROM yourtable t1 
WHERE val IS NOT NULL OR 
NOT EXISTS (SELECT 'VALUED' 
    FROM yourtable t2 
    WHERE t2.id = t1.id 
    AND t2.val IS NOT NULL) 
相關問題