2014-09-03 4 views
2

У меня есть список слов ab и c.
В моей базе данных содержится текстовый столбец содержит много слов, разделенных пробелом.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?

EDIT

Благодаря Дуэйн Тоуэлл, я пришел с этим запросом.

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

Смежные вопросы