2014-09-03 63 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