2017-04-11 37 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