WHERE子句中的SQL CASE语句,用于搜索列的任何行中是否存在值
我有下表:WHERE子句中的SQL CASE语句,用于搜索列的任何行中是否存在值,sql,sql-server,Sql,Sql Server,我有下表: Event StaffName JobRole Event 1 FirstName LastName1 Subordinate Type 1 Event 1 FirstName LastName2 Subordinate Type 2 Event 2 FirstName LastName3 Supervisor Event 2 FirstName LastName4 Subordi
Event StaffName JobRole
Event 1 FirstName LastName1 Subordinate Type 1
Event 1 FirstName LastName2 Subordinate Type 2
Event 2 FirstName LastName3 Supervisor
Event 2 FirstName LastName4 Subordinate Type 1
Event 2 FirstName LastName5 Subordinate Type 2
我的查询提供了一个更大的报告,每个返回的行生成一个报告,但前提是满足某些条件。我正在尝试创建一个WHERE子句,该子句执行以下操作:
- 如果主管正在处理一个事件,则每个事件生成一份报告 仅限主管。下属不需要报告李>
- 如果没有为事件指派主管,则仅为每个下属类型1生成一份报告。(理想情况下,无论有多少下属在该活动中工作,它都将是一份单一的报告,但没有它我也能活下去。)
- 下属类型2永远不需要报告
我在SQLServerManagementStudio 2012工作,如果这有帮助的话。谢谢 这最好作为OR:
WHERE (JobRole = 'Supervisor' or JobRole = 'Subordinate Type 1')
请注意,如果您测试的文本中没有通配符,则LIKE相当于=,因此为了更清楚地说明发生了什么,最好使用=。尝试以下方法:
WHERE (JobRole = 'Supervisor') -- is supervisor
OR (JobRole = 'Subordinate Type 1' -- or is Subordinate Type 1 and...
and Event not in (select distinct event -- not is event with superv.
from Table
where JobRole = 'Supervisor')
)
希望这有帮助 如果没有任何通配符进行比较,为什么要使用
like
。我会使用=
来代替。对于我的实际工作角色,会有一个通配符,为了清晰起见,我在这里简化了它们。尽管它的性能很差,并且无法处理下属类型1只有一个报告,但您的代码应该可以工作。我怀疑你的数据并不像你想象的那样,或者你有打字错误。我会仔细检查这些值,看看它们是否与您在您的情况下编写的内容完全相同。我不确定您所说的“您的数据实际上与您认为的不一样”是什么意思?肯定没有输入错误,但我可能对数据有误解。请将解决您问题的答案标记为已接受的答案。这将为事件的下属生成报告#2我非常确定,从功能上讲,这与您显示的WHERE子句相当。从你对上述评论的回复来看,我认为你没有充分解释这个问题;例如,您的评论说需要通配符。根据你在问题中的解释,我不明白它们是怎么回事。我不是说需要通配符,我是说如果没有通配符,使用=
如果没有通配符,也没有通配符,那么它是不等价的EP,这是我在使用EXISTS变得更复杂之前解决这个问题的最早尝试之一;它解决了事件2的问题,但为事件1创建了一个新的问题,因为它同时返回主管和下属,而不仅仅是主管。@Simon--在这个特定的表中有几十种类型的JobRole,例如,可能有几种不同类型的主管。通配符将允许我返回任何类型的主管角色;对于下属也是如此,不过在我的示例中,我将其减少到了两个,以便说明如何正确地排除某些下属。
WHERE (JobRole = 'Supervisor') -- is supervisor
OR (JobRole = 'Subordinate Type 1' -- or is Subordinate Type 1 and...
and Event not in (select distinct event -- not is event with superv.
from Table
where JobRole = 'Supervisor')
)