Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WHERE子句中的SQL CASE语句,用于搜索列的任何行中是否存在值_Sql_Sql Server - Fatal编程技术网

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永远不需要报告
根据我在别处看到的一些建议,我尝试了以下方法(事件条件被指定为运行报告的一部分,因此不包括在查询中):

当为某个事件(即事件2)指定了一个主管时,此功能正常工作,但当给定事件(即事件1)中不存在主管时,此功能返回零值。我不知道为什么ELSE部分没有发挥作用,但我承认我对存在的细微差别不太熟悉


我在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') 
   )