Requête SQL où le champ NE contient PAS $ x


132

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


Puis-je utiliser la fonction CONTAINS () (sql) pour effectuer la même vérification?
Kate le

Réponses:


291

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%';

1
qu'est-ce que xb? vos lettres sont très déroutantes. Je recommande d'utiliser une table ou un champ.
Whitecat

Assurez-vous que si vous utilisez une sous-requête pour NOT INcela, 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;
Bacon Bits

17

SELECT * FROM table WHERE field1 NOT LIKE '%$x%'; (Assurez-vous de bien échapper $ x au préalable pour éviter l'injection SQL)

Edit: NOT INfait 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.


Qu'est-ce qui est considéré comme s'échapper correctement? Je sais qu'avec des chaînes normales, vous n'avez qu'à échapper à quelques éléments, mais LIKE a des caractères spéciaux supplémentaires.
Pieter Bos
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.