web-dev-qa-db-fra.com

Chaîne de sélection SQL qui ne contient pas Y mais contient X

J'essaie de sélectionner toutes les instances où ce champ de base de données contient une chaîne mais ne contient pas de valeur spécifique.

Exemple: J'essaie de sélectionner chaque instance de "chaise rouge" où "chaise rouge" n'est pas précédé de "grand". Si je devais exécuter cette requête dans le tableau suivant, je ne récupérerais que la ligne portant l'ID 2:

 + ---------- + -------------- + --------- + 
 | ID | contenu | 
 + ---------- + ------------------------ + 
 | 1 | La grande chaise rouge | 
 | 2 | J'ai une chaise rouge | 
 | 3 | J'ai une grande chaise | 
 + ---------- + ------------------------ + 

Merci d'avance!

16
Katzumi

Vous pouvez utiliser:

LIKE '%red chair%' AND NOT LIKE '%big%'

edit : Correction de chaînes similaires à LIKE

15
kand

Cela donnera ce que vous voulez, en supposant que l'expression "chaise rouge" ne se produise qu'une seule fois dans content. Si cela peut apparaître plus d'une fois («La chaise rouge est une grande chaise rouge»), quel résultat voulez-vous?

SELECT * FROM Furniture 
  WHERE content LIKE '%red chair%' AND content NOT LIKE '%big red chair%'
4
Larry Lustig
WHERE content like '%red chair%'
AND content not like '%big red chair%'

Mais ça ne va pas être rapide!

3
Paul Creasey

Sélectionnez la chaîne qui commence par X et ne contient pas X

WITH T 
     AS 
     (
      SELECT * 
        FROM (
              VALUES ('xenophilia'), 
                     ('xbox'), 
                     ('regex')
             ) AS T (c)
     )
SELECT * 
  FROM T
 WHERE c LIKE 'x%'
       AND c NOT LIKE '_%x%';
0
onedaywhen