使用存储过程

时间:2017-03-26 10:40:43

标签: sql-server

我正在尝试编写Events的SQL Server查询,这些查询属于类别5或6,但在War中未提及DeathEventDetails }列。

我的查询:

select 
    EventName, EventDetails
from 
    tblEvent
where 
    CategoryID in (5, 6)
    and (EventDetails not like '% War %'
         or EventDetails not like '% Death %')

但是这会返回带有'War'字样的输出:

enter image description here

我的问题:

  1. 为什么没有“第二次世界大战”被过滤掉?
  2. 我是否需要指定(在查询中)“战争”这个词的所有可能性出现在EventDetails列中,如'%War','%War','War%'等?
  3. 是否有其他选项可以过滤特定列中的特定字词?
  4. 我仍然感到困惑,我们可能不知道“战争”这个词会出现在哪个地方,无论是在中间,还是在开始或结束。所以我们需要为每种可能性添加条件,比如

    select EventName, EventDetails
    from tblEvent
    where  
    CategoryID in (5,6)
    AND EventDetails not like '% War %'
        AND EventDetails not like '% War'
        AND EventDetails not like 'War %'
        AND EventDetails not like '%War%'
        AND EventDetails not like '% Death %'
        AND EventDetails not like '% Death'
        AND EventDetails not like 'Death %'
        AND EventDetails not like '%Death%'
    

    这是正确的查询标准吗?

1 个答案:

答案 0 :(得分:1)

我想您要使用AND代替OR

select EventName,
    EventDetails
from tblEvent
where CategoryID in (5, 6)
    and EventDetails not like '% War %'
    and EventDetails not like '% Death %'

另请注意,以上内容将允许warWAR等。要进行不区分大小写的搜索,您可以使用较低(或较高):

select EventName,
    EventDetails
from tblEvent
where CategoryID in (5, 6)
    and lower(EventDetails) not like '% war %'
    and lower(EventDetails) not like '% death %'

还要考虑一下战争在句子中的最后一句话的情况。

例如:

This is a war. abcd. . . 

这也是不匹配的。要使用此功能,您可能必须使用基于模式的匹配。