WHERE子句中的SQL CASE语句,用于搜索列的任何行中是否存在值

时间:2017-05-31 15:45:05

标签: 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      Subordinate Type 1
Event 2    FirstName LastName5      Subordinate Type 2

我的查询会提供一个较大的报告,该报告会为每个返回的行生成一个报告,但仅限于满足某些条件的情况。我正在尝试创建一个执行以下操作的WHERE子句:

  • 如果主管正在开展活动,则每个生成一个报告 只有主管。下属不需要报告。
  • 如果没有为事件分配Supervisor,则仅为每个从属类型1生成一个报告。 (理想情况下,无论有多少下属正在处理该事件,它都将是一份报告,但我可以在没有这个的情况下生活。)
  • 从属类型2不会需要报告

我根据我在其他地方看到的一些建议尝试了以下内容(事件条件被指定为运行报告的一部分,因此未包含在查询中):

WHERE
JobRole LIKE 
(CASE WHEN EXISTS (SELECT JobRole
                   FROM Table
                   WHERE JobRole LIKE 'Supervisor') 
      THEN 'Supervisor'
    ELSE 'Subordinate Type 1'
END)

当Supervisor被分配给事件(即事件2)时,这可以正常工作,但当给定事件(即事件1)的Supervisor不存在时返回零值。我不确定为什么ELSE位没有进入,但我承认我并不过分熟悉EXISTS的细微差别。

我在SQL Server Management Studio 2012中工作,如果有帮助的话。谢谢!

2 个答案:

答案 0 :(得分:0)

试试这个:

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

希望这有帮助!

答案 1 :(得分:-1)

最好以OR:

完成
WHERE (JobRole = 'Supervisor' or JobRole = 'Subordinate Type 1')

请注意,如果您正在测试的文本中没有通配符,则LIKE等效于=,因此为了更清楚地了解正在发生的事情(恕我直言),使用=。