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。
感谢任何帮助!
答案 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)前缀...以帮助下一个出现的人。
此外 - 通过在表达式周围使用括号将一组条件与and
和or
组合在一起时,可以避免出现细微的逻辑错误。我把它们改成了我认为你的意思,但我可能错了; - )