SQL中具有或条件的同一列上的多个不相似运算符失败

SQL中具有或条件的同一列上的多个不相似运算符失败,sql,sql-server,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] 1 '2013-01-01 00:00:00.000' 'error

表架构:

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]
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'
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'
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
值:

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]
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'
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'
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
针对表的查询返回:

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]
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'
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'
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
输出:

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]
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'
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'
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
问题:

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

有人能解释一下,当明确提到日期条件大于2014时,为什么查询返回所有表值?我理解将消息条件保留在括号中会产生适当的结果。但是,我想知道为什么sql排除了前面提到的日期条件,而not like运算符不在括号中。

您缺少了偏执so或优先级较低的转换为

WHERE 
MESSAGE NOT LIKE '%"FOOT_BALL"%' OR (MESSAGE NOT LIKE '%BASKET_BALL%'
AND CREATED_ON >= '2014-01-01')

MESSAGE NOT LIKE '%"FOOT_BALL"%' 
返回3行,不关心日期


将两个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'
根据您的需要,括号应该围绕后面的部分,如下所示:

    MESSAGE NOT LIKE '%"FOOT_BALL"%' OR (MESSAGE NOT LIKE '%BASKET_BALL%'
    AND CREATED_ON >= '2014-01-01')

同样不带支架,也包括带脚球和带篮球的线条,如篮球!=足球——关于或的逻辑用法的问题。。。您可能正在为您的评论jpw寻找某种xor运算符库…我理解,通过放置括号,我们可以得到正确的结果。但我想理解sql执行此条件消息的顺序,它不像“%”FOOT\u BALL“%”,或者它不像“%BASKET\u BALL%”,并且在“>=”2014-01-01”上创建,因为查询会一起忽略日期条件。@RameshM它不会忽略日期,但日期和BASKET\u BALL条件是绑定在一起的;它与不喜欢足球的第一排、篮球和日期的第二排、不喜欢足球的第三排和第四排相匹配。