在单个select语句中进行SQL if else筛选

在单个select语句中进行SQL if else筛选,sql,sql-server,tsql,Sql,Sql Server,Tsql,是否可以输出以下内容: 对于personId的每个组,如果电子邮件以“@company.com”结尾,则按[where type='h']过滤,否则按[where type='t']过滤 因此,查询将输出以下内容: 一,bob@hotmail.comh 二,bill@hotmail.comt 谢谢这是基于对逻辑的描述,而不是示例结果 我想您需要在where子句中使用布尔逻辑: 此特定版本假定电子邮件从不为空。将其纳入逻辑很容易 编辑: 我明白了,这是一个优先级查询: select top (1)

是否可以输出以下内容:

对于personId的每个组,如果电子邮件以“@company.com”结尾,则按[where type='h']过滤,否则按[where type='t']过滤 因此,查询将输出以下内容:

一,bob@hotmail.comh

二,bill@hotmail.comt


谢谢

这是基于对逻辑的描述,而不是示例结果

我想您需要在where子句中使用布尔逻辑:

此特定版本假定电子邮件从不为空。将其纳入逻辑很容易

编辑:

我明白了,这是一个优先级查询:

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)
                            );

这是基于对逻辑的描述,而不是示例结果

我想您需要在where子句中使用布尔逻辑:

此特定版本假定电子邮件从不为空。将其纳入逻辑很容易

编辑:

我明白了,这是一个优先级查询:

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)
                            );
您可以从插入中排除类型列,并改为使用计算字段,如下所示:

create table #emails (personId int, email nvarchar(100), type as case when email like '%@company.com' then 'h' else 't' end)
这样,所有插入都会自动处理类型列

编辑:如果仍要在Word之后执行更新,只需在select中使用相同的CASE语句。

您可以从insert中排除type列,并使用计算字段,如下所示:

create table #emails (personId int, email nvarchar(100), type as case when email like '%@company.com' then 'h' else 't' end)
这样,所有插入都会自动处理类型列


编辑:如果您仍然想在单词之后执行更新,只需在select中使用相同的CASE语句。

这个问题有点难理解,但我认为您正在寻找类似以下内容:

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,否则键入t。

这个问题有点难理解,但我认为您正在寻找这样的内容:

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,否则键入t。

如果我没有弄错的话。Your@company.com是电子邮件列的默认值。因此,您希望获得实际的电子邮件,这将是每个人的下一封电子邮件。我不确定你为什么要使用类型栏,因为在我看来,它是h还是t并不重要,只要我们可以通过以下简单的查询排除以@company.com结尾的电子邮件:

SELECT *
FROM  #emails
WHERE 
    RIGHT(email, 11) <> 'company.com'
在此基础上,可以根据需要扩展where子句

如果我做对了。Your@company.com是电子邮件列的默认值。因此,您希望获得实际的电子邮件,这将是每个人的下一封电子邮件。我不确定你为什么要使用类型栏,因为在我看来,它是h还是t并不重要,只要我们可以通过以下简单的查询排除以@company.com结尾的电子邮件:

SELECT *
FROM  #emails
WHERE 
    RIGHT(email, 11) <> 'company.com'

在此基础上,可以根据需要扩展where子句

您的示例结果不符合您的规则。如果电子邮件以“@company.com”结尾,则获取类型为='h'的地址,否则获取类型为='t'的地址。请共享您的示例结果。如果电子邮件以“@company.com”结尾,则获取类型为='h'的地址,否则获取类型为='t'的地址。请共享您的示例结果这正好给了我:[2,bill@hotmail.com,t]@AndrewJocelyn。我认为你的解释不清楚。您正试图根据优先级条件为每个personId获取一行。你不仅仅是在过滤数据,我认为你是对的。我将使用您的优先排序示例。Thanks@AndrewJocelyn . . . 最后一个查询应该满足您的要求。这只会给我:[2,bill@hotmail.com,t]@AndrewJocelyn。我认为你的解释不清楚。您正试图根据优先级条件为每个personId获取一行。你不仅仅是在过滤数据,我认为你是对的。我将使用您的优先排序示例。Thanks@AndrewJocelyn . . . 最后一个查询应该满足您的要求。这样看起来更好。我需要“案例存在时”。谢谢,看起来好多了。我需要“案例存在时”。谢谢