2008-10-24 6 views
88

Je veux trouver une requête SQL pour trouver des lignes où field1 ne contient pas $ x. Comment puis-je faire ceci?

+0

Puis-je utiliser C ONTAINS() fonction (sql) pour faire le même contrôle? – Kate

Répondre

193

Quel type de champ est-ce? L'opérateur IN ne peut pas être utilisé avec un seul champ, mais est destiné à être utilisé dans les sous-requêtes ou 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 êtes à la recherche d'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 restreignez pour que la chaîne que vous recherchez doit commencer par la chaîne donnée, il peut utiliser des indices (s'il existe 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%'; 
+0

qu'est-ce que x.b? Vos lettres sont très très confuses. Je recommande d'utiliser la table ou le champ. – Whitecat

+0

Assurez-vous que si vous utilisez une sous-requête pour 'NOT IN' qu'aucune des valeurs ne sera NULL, car [NOT IN et NULL ne se combinent pas de façon évidente] (https://stackoverflow.com/questions/129077/ valeurs non-dans-clause-et-null) si vous n'êtes pas familier avec la logique à trois valeurs. Ici vous utiliseriez 'SELECT a FROM x où xb NOT IN (SELECT b FROM y WHERE b n'est pas NULL);' Si vous avez également besoin d'exclure les valeurs NULL, vous devez faire ceci: 'SELECT a FROM x WHERE xb NOT IN (SELECT b FROM y O WH b n'est pas NULL) et xb N'EST PAS NULL; ' –

14

SELECT * FROM table WHERE field1 NOT LIKE '%$x%'; (Assurez-vous d'échapper à $ x correctement avance pour éviter l'injection SQL)

Edit: NOT IN fait quelque chose d'un peu différent - votre question n'est pas tout à fait claire pick donc que l'on à utiliser. LIKE 'xxx%' peut utiliser un index. LIKE '%xxx' ou LIKE '%xxx%' ne peut pas.

+0

Qu'est-ce qui est considéré comme s'échapper correctement? Je sais qu'avec des cordes normales, il suffit d'échapper à certaines choses, mais LIKE a des caractères spéciaux supplémentaires. –

Questions connexes