SQL中具有OR条件的同一列上的多个NOT LIKE运算符在SQL中失败

Ram*_*h M 2 sql sql-server

表格架构:

CREATE TABLE [dbo].[Message](
    [id] [int] NOT NULL,
    [created_on] [datetime] NULL,
    [message] [nvarchar](max) NULL,
 CONSTRAINT [PK_Message] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

值:

1   '2013-01-01 00:00:00.000'   'error occured "BASKET_BALL"'
2   '2014-01-01 00:00:00.000'   'error occured "FOOT_BALL"'
3   '2012-01-01 00:00:00.000'   'I am not involved in like operator'
4   '2014-02-01 00:00:00.000'   'I might be involved'
Run Code Online (Sandbox Code Playgroud)

查询返回的表:

SELECT 
    ID,CREATED_ON,MESSAGE 
FROM 
    MESSAGE
WHERE 
    MESSAGE NOT LIKE '%"FOOT_BALL"%' OR MESSAGE NOT LIKE '%BASKET_BALL%'
    AND CREATED_ON >= '2014-01-01'
Run Code Online (Sandbox Code Playgroud)

输出:

1   2013-01-01 00:00:00.000 error occured "BASKET_BALL"
2   2014-01-01 00:00:00.000 error occured "FOOT_BALL"
3   2012-01-01 00:00:00.000 I am not involved in like operator
4   2014-02-01 00:00:00.000 I might be involved
Run Code Online (Sandbox Code Playgroud)

题:

有人可以解释为什么在明确提到日期条件大于2014时查询返回所有表值的原因吗?我知道将消息条件放在方括号中会产生适当的结果。但是,想知道为什么当not like运算符不在括号中时sql排除提到的日期条件。

jpw*_*jpw 5

这是因为AND运算符的优先级高于OR。更改为此:

SELECT 
    ID,CREATED_ON,MESSAGE 
FROM 
    MESSAGE
WHERE 
    (MESSAGE NOT LIKE '%"FOOT_BALL"%' OR MESSAGE NOT LIKE '%BASKET_BALL%')
    AND CREATED_ON >= '2014-01-01'
Run Code Online (Sandbox Code Playgroud)

根据您的需要,括号可能会包围后一部分,如下所示:

    MESSAGE NOT LIKE '%"FOOT_BALL"%' OR (MESSAGE NOT LIKE '%BASKET_BALL%'
    AND CREATED_ON >= '2014-01-01')
Run Code Online (Sandbox Code Playgroud)