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条件是绑定在一起的;它与不喜欢足球的第一排、篮球和日期的第二排、不喜欢足球的第三排和第四排相匹配。