Réponses:
De quel genre de champ s'agit-il? L'opérateur IN ne peut pas être utilisé avec un seul champ, mais est destiné à être utilisé dans des sous-requêtes ou avec des listes prédéfinies:
-- subquery
SELECT a FROM x WHERE x.b NOT IN (SELECT b FROM y);
-- predefined list
SELECT a FROM x WHERE x.b NOT IN (1, 2, 3, 6);
Si vous recherchez une chaîne, optez pour l'opérateur LIKE (mais ce sera lent):
-- Finds all rows where a does not contain "text"
SELECT * FROM x WHERE x.a NOT LIKE '%text%';
Si vous le restreignez afin que la chaîne que vous recherchez doive commencer par la chaîne donnée, il peut utiliser des indices (s'il y a un index sur ce champ) et être raisonnablement rapide:
-- Finds all rows where a does not start with "text"
SELECT * FROM x WHERE x.a NOT LIKE 'text%';
NOT IN
cela, aucune des valeurs ne sera NULL, car NOT IN et NULL ne se combinent pas de manière évidente si vous n'êtes pas familier avec la logique à trois valeurs. Ici, vous utiliserez SELECT a FROM x WHERE x.b NOT IN (SELECT b FROM y WHERE b IS NOT NULL);
Si vous devez également exclure les valeurs NULL, vous devez le faire:SELECT a FROM x WHERE x.b NOT IN (SELECT b FROM y WHERE b IS NOT NULL) AND x.b IS NOT NULL;
SELECT * FROM table WHERE field1 NOT LIKE '%$x%';
(Assurez-vous de bien échapper $ x au préalable pour éviter l'injection SQL)
Edit: NOT IN
fait quelque chose d'un peu différent - votre question n'est pas totalement claire, alors choisissez celle à utiliser. LIKE 'xxx%'
peut utiliser un index. LIKE '%xxx'
ou LIKE '%xxx%'
ne peut pas.