2017-04-11 54 views
0

我有以下表中有USENAME和站點信息:SQL查詢 - 找到所有NULLS

Username Site 
jbrown  NULL 
jbrown  NULL 
jbrown  NULL 
msmith  3 
msmith  12 
msmith  NULL 
ptodd  18 
ptodd  16 
ptodd  NULL 
jdrem  3 
jdrem  NULL 
jdrem  NULL 

我需要做的是獲取該都NULLS爲他們的網站或那些網站的任何用戶名是是3。因此,在這種情況下,輸出將是:

jbrown 
msmith 
jdrem 

注意ptodd是不是在最終的結果是他們沒有網站,有3

我被,但不知道考慮一組如何說所有NULLS或任何是基於用戶名的3。

回答

3

您可以使用group by和條件聚合。

select username 
from tablename 
group by username 
having count(*)=count(case when site is null then 1 end) 
or count(case when site=3 then 1 end)>=1 
+0

嗨VKP,感謝您的答覆。似乎工作。我的一個問題是,對於用戶名集合,你寫的代碼如何選擇所有的空值?我看到它是如何爲網站= 3,但不是如何爲所有空值如jbrown的情況。 –

+0

請記住,我們可以有一個給定用戶的情況,它是NULL,13,14,在這種情況下它是NULL,但不是所有都是NULLS。 –

+0

@NatePet .. count(*)'是每個用戶的總行數,'count(當site爲null,然後是1 end時)'統計每個用戶的所有'null'值(所有其他值都被忽略)。如果它們相等,則表示用戶具有網站的所有空值。在用戶有NULL的情況下,13,14 count(*)= 3,null count = 1 ..第一個條件失敗..也就是用戶沒有site = 3的行。所以第二個條件也失敗了。因此該用戶將不會被檢索。 –

0

有條件的聚集可能會更快,但這裏是另一種選擇:使用not exists(...) or Site = 3

select distinct Username 
from t 
where not exists (
    select 1 
    from t as i 
    where i.username = t.username 
    and i.site is not null 
    ) 
    or Site = 3 
0

我喜歡用我稱之爲 「比」 SQL本金。你在哪裏確定沒有什麼比「更好」。

select username, site 
from table_name t 
left join table_name betterThan on betterThan.site is not null and betterThan.username = t.username and betterThan.id <> t.id 
where (t.site is null or t.site = 3) and betterThan.id is null; 
1

我想這可能是太相似了其他數,但..

SELECT [Username] 
FROM  Table 
GROUP BY [Username] 
HAVING MAX([Site]) IS NULL OR 
     COUNT(CASE WHEN [Site] = 3 THEN 1 END) > 0 
+0

謝謝。如果所有的值都爲空,那麼MAX如何工作以便爲給定的用戶名 –

+0

提取所有的空值。然後MAX([Site])IS NULL'返回true .. OR條件處理你的你的其他要求'那些任何網站是3' – JamieD77