2014-09-03 60 views
2

我有一个字词列表abc
在我的数据库中,文本列中包含许多由空格分隔的单词。SQL:查找包含意外字词的字符串

我想列出包含其他单词的所有记录,我期望。

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 */ 

查看SQLFiddle

我目前的查询只返回3,这不是我正在寻找的。 无论如何在postgresql中做到这一点?

编辑

感谢德韦恩Towell,我想出了这个查询。

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

回答

2

可以打破串入行,并使用IN,像这样。

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

请参阅fiddle

+0

谢谢!我发现使用regexp_split_to_array没有子查询会更快。 – oldergod 2014-09-03 06:15:39