SQL if else在单个选择语句中过滤

时间:2018-10-16 11:31:15

标签: sql sql-server tsql

是否可以输出以下内容:

  

对于每个按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

谢谢

4 个答案:

答案 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子句。