是否可以输出以下内容:
对于每个按personId分组的组,如果电子邮件以“ @ company.com”结尾,则按[where type ='h']过滤,否则按[where type ='t']过滤 因此查询将输出以下内容:
1 bob@hotmail.com h
2 bill@hotmail.com t
create table #emails (personId int, email nvarchar(100), type char(1) )
insert into #emails values (1, 'bob@company.com', 't');
insert into #emails values (1, 'bob@hotmail.com', 'h');
insert into #emails values (2, 'bill@hotmail.com', 't');
insert into #emails values (2, 'bill@gmail.com', 'h');
select * from #emails
drop table #emails
谢谢
答案 0 :(得分:3)
这是基于逻辑的描述,而不是示例结果。
我认为您想在where
子句中使用布尔逻辑:
where (email like '%@company.com' and type = 'h') or
(email not like '%@company.com' and type = 't')
此特定版本假定email
从未为NULL
。将其整合到逻辑中很容易。
编辑:
我知道,这是一个优先级查询:
select top (1) with ties e.*
from #emails e
order by row_number() over (partition by personId
order by (case when email like '%@company.com' and type = 'h' then 1
when type = 't' then 2
else 3
end)
);
答案 1 :(得分:0)
您可以从插入中排除type
列,而改为使用计算字段,如下所示:
create table #emails (personId int, email nvarchar(100), type as case when email like '%@company.com' then 'h' else 't' end)
就像您的所有插入内容都会自动处理type
列一样
编辑:如果您仍然想在单词后执行更新,只需在选择中使用相同的CASE
语句即可。
答案 2 :(得分:0)
这个问题有点难以理解,但是我认为您正在寻找这样的东西:
SELECT personId, email, type
FROM #emails t0
WHERE type = CASE WHEN EXISTS(
SELECT 1
FROM #emails t1
WHERE t0.personId = t1.personId
AND t1.email LIKE '%@company.com'
) THEN 'h' ELSE 't' END
这将提供理想的结果,因此问题的文本应类似于“当该人的记录中电子邮件结尾为@company.com
时,键入h
,否则键入{{1 }}。
答案 3 :(得分:0)
如果我做对了。您的@company.com
是“电子邮件”列的默认值。因此,您想要获取实际的电子邮件,这将是每个人的下一封电子邮件。我不确定类型列为什么要使用它,因为(我认为)是h还是t都无所谓,只要我们可以直接排除以@company.com
结尾的电子邮件这个简单的查询:
SELECT *
FROM #emails
WHERE
RIGHT(email, 11) <> 'company.com'
从那里可以根据需要扩展where子句。