SQL查询-查找所有空值

SQL查询-查找所有空值,sql,tsql,Sql,Tsql,我有下表,其中包含Usename和站点信息: 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 我需要做的是获取用户名,这些用户名对于他们的站点或者任何

我有下表,其中包含Usename和站点信息:

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
我需要做的是获取用户名,这些用户名对于他们的站点或者任何站点都是空的。因此,在这种情况下,输出为:

jbrown
msmith
jdrem
请注意,ptodd不是最终结果,因为他们的站点没有3个


我正在考虑一个分组,但不确定如何根据用户名说出所有空值或任何3

您可以使用
分组依据和条件聚合

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

您可以使用分组依据和条件聚合

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

条件聚合可能会更快,但这里有另一个选项:

使用
不存在(…)或站点=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

条件聚合可能会更快,但这里有另一个选项:

使用
不存在(…)或站点=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

我喜欢使用我称之为“优于”的sql主体。确保没有比这更好的东西

选择用户名、站点
来自表\u name t
左联接表\u betterThan.site上的betterThan名称不为null,betterThan.username=t.username和betterThan.id t.id
其中(t.site为null或t.site=3)且betterThan.id为null;

我喜欢使用我称之为“优于”的sql主体。确保没有比这更好的东西

选择用户名、站点
来自表\u name t
左联接表\u betterThan.site上的betterThan名称不为null,betterThan.username=t.username和betterThan.id t.id
其中(t.site为null或t.site=3)且betterThan.id为null;

我想这可能与其他类似,无法计算,但是

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

我想这可能和其他的太相似了,无法计算,但是

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

非常感谢。如果某个用户名的所有值都为null,那么MAX是如何工作的,从而为给定的用户名提取所有null的。。然后
MAX([Site])为空
返回true。。OR条件处理您的其他要求
任何3号站点都可以满足的要求
谢谢。如果某个用户名的所有值都为null,那么MAX是如何工作的,从而为给定的用户名提取所有null的。。然后
MAX([Site])为空
返回true。。OR条件处理您的其他要求
任何3
Hi Vkp的站点,谢谢您的回复。似乎有效。我有一个问题是,对于用户名集,您编写的代码如何为所有null选择?我看到了site=3的情况,但没有看到jbrown对所有空值的情况。请记住,对于给定的用户,它可能是空的,13、14,在这种情况下,它是空的,但不是所有都是空的。@NatePet
count(*)
是每个用户的总行数,
count(如果站点为null,则为1结束)
统计每个用户的所有
null
值(计数时忽略所有其他值)…如果它们相等,则表示用户具有站点的所有null值。如果用户有NULL,13,14 count(*)=3,NULL count=1..第一个条件失败..而且用户没有站点=3行..因此第二个条件也失败。因此将无法检索该用户。您好,Vkp,感谢您的回复。似乎有效。我的一个问题是,对于用户名集,您编写的代码如何选择所有空值?我看到了site=3的情况,但没有看到jbrown对所有空值的情况。请记住,对于给定的用户,它可能是空的,13、14,在这种情况下,它是空的,但不是所有都是空的。@NatePet
count(*)
是每个用户的总行数,
count(如果站点为null,则为1结束)
统计每个用户的所有
null
值(计数时忽略所有其他值)…如果它们相等,则表示用户具有站点的所有null值。如果用户有NULL,13,14 count(*)=3,NULL count=1..第一个条件失败..而且用户没有站点=3行..因此第二个条件也失败。因此,将无法检索该用户。