plusieurs opérateurs NOT LIKE sur la même colonne avec la condition OU échoue dans SQL

Schéma de table:

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] 

Valeurs:

 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' 

Requête return contre la table:

 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' 

Sortie:

 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 

Question:

Quelqu'un pourrait-il expliquer pourquoi la requête returnne toutes les valeurs de la table quand explicitement la condition de date est mentionnée pour plus de 2014? Je comprends qu'en gardant la condition du message entre crochets, cela donne un résultat correct. Cependant, vous aimeriez savoir pourquoi le sql exclut la condition de date mentionnée lorsque l'opérateur non similaire n'est pas dans la tranche.

C'est parce que l'opérateur AND a une priorité supérieure à OR . Changer pour ceci:

 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' 

Selon ce que vous voulez, la parenthèse devrait entourer la dernière partie, comme ceci:

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

Il vous manque des parenthèses donc OR ayant une priorité inférieure se traduit par

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

returs 3 rangs, ne se soucie pas de la date

Placez les deux OR entre parenthèses.