如何在标题中查询所有“IT”员工

时间:2016-12-08 16:50:40

标签: sql sql-server

   select C.CardNumber, C.Name, Text5, Text3 from Access.Credential C
   left join Access.Personnel P
   on C.Name = P.Name
   where C.Active = 1
   and C.Name not like '%Spare%'
   and Text3 like 'IT%'
   or Text5 like '%IT %'
   order by Text5

查询所有IT人员,包括管理员和承包商。 Text5是员工头衔,text3是IT部门。 我只想要text3或text5列中的标题,只有IT。我几乎在那里,但我得到'信任'和其他东西。

要记住一些事情。 IT并不总是标题中的第一个(文本5),例如MGR IT。

感谢任何帮助!

3 个答案:

答案 0 :(得分:4)

它认为你正在寻找这个条件:

where C.Active = 1 and
      C.Name not like '%Spare%' and
      ' ' + Text3 + ' ' like '% IT %'

这会在文本的开头和结尾添加一个空格,然后查找被空格包围的IT

答案 1 :(得分:0)

尝试分组OR条件。

Where C.Active = 1 
and C.Name not like '%Spare%' 
and (Text3 like 'IT%' or Text5 like '% IT %')

答案 2 :(得分:0)

使用LIKE在字符列中间搜索文本无法使用索引,并且可能执行得非常糟糕。如果您对模式进行了治理(或者与某人有好友),那么您可以考虑使用全文查询。这需要将全文索引添加到可搜索表中,但如果这类搜索很常见,则非常值得。

有关详细信息,请查看此处:https://msdn.microsoft.com/en-us/library/ms142571.aspx

不要因过滤器等技术说明而被推迟。对于“普通”字符数据......已经存在必需的过滤器。只需在表上放置索引,SQL就会“抓取”文本列,并根据文本中的单词构建优秀的索引。

然后,您的查询类似于:

select 
  C.CardNumber, C.Name, Text5, Text3 
from 
  Access.Credential C
  left outer join 
  Access.Personnel P
  on 
    C.Name = P.Name
where 
  C.Active = 1 and
  not contains( C.Name'Spare' ) and
  (
    contains( Text3, 'IT' ) or
    contains( Text5, 'IT' )
  )
order by 
  Text5

一些微不足道的观察:

从查询中可以看出哪个表包含Text3或Text5列。您可以考虑为每个引用的列添加别名(C或P)前缀...以帮助下一个出现的人。

此外 - 通过在表达式周围使用括号将一组条件与andor组合在一起时,可以避免出现细微的逻辑错误。我把它们改成了我认为你的意思,但我可能错了; - )