表格架构:
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排除提到的日期条件。
这是因为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)
| 归档时间: |
|
| 查看次数: |
4331 次 |
| 最近记录: |