2014-09-03 3 views
2

J'ai une liste de mots ab et c.
Dans ma base de données, il y a une colonne de texte contenant plusieurs mots séparés par un espace.SQL: trouver des chaînes qui contiennent des mots inattendus

Je voudrais lister tous les enregistrements qui contiennent d'autres mots que celui que je suis attendu.

create table a (id int, memo text); 
insert into a values 
    (1, 'a aa b'), 
    (2, 'b a'), 
    (3, 'c a d'), 
    (4, 'b cc a'); 

select * from a where memo /*matches something else than 'a', 'b', 'c'*/ ~ '[^abc ]'; 
/* should return 1 because of aa */ 
/*    3 because of d */ 
/*    4 because of cc */ 

Voir SQLFiddle.

Ma requête actuelle ne renvoie que 3, ce qui n'est pas ce que je recherche. Y a-t-il un moyen de le faire dans postgresql?

EDIT

Merci à Dwayne Towell, je suis venu avec cette requête.

SELECT * FROM a 
WHERE NOt(ARRAY['a','b','c'] @> regexp_split_to_array(memo, E'\\s+')::text[]); 

Répondre

2

Vous pouvez briser la chaîne en lignes et utiliser IN, comme celui-ci.

SELECT * FROM (
    SELECT id,regexp_split_to_table(memo, E'\\s+') AS word FROM a 
) x 
WHERE word NOT in ('a','b','c'); 

Voir fiddle.

+0

merci! J'ai trouvé que c'était plus rapide d'utiliser regexp_split_to_array sans sous-requêtes. – oldergod

Questions connexes