2016-12-13 2 views
0

У меня есть элементы массива в моем запросе, к которым мне нужно добавить% в начале и конце.Postgresql: Добавить% к началу и концу элементов массива

Table friends 
id type keywords 
1 Close beverage,party,cool 
2 Close party 
3 Close beverage 
4  Far  beverage 

В настоящее время мой запрос:

select id from friends f where f.type = 'Close' and ('BEVERAGE ALLOWED' ilike any((string_to_array(f.keywords,','))) 

В приведенном выше запросе (string_to_array(f.keywords,',')) преобразовывают ключевых слов в массив, таких как: {beverage,party,cool}. Но мне нужно добавить знак% в начале и в конце каждого элемента так, чтобы элементы массива являются: {%beverage%,%party%,%cool%}

+0

Я удалил мой ответ - вот @Abelisto 'CONCAT ('{%', заменить (" напиток, вечеринка, круто ',', ','%,% '),'%} ') 'из комментариев –

ответ

2

Вы можете использовать это, чтобы сгенерировать массив:

string_to_array('%' || replace(f.keywords, ',', '%,%') || '%', ',') 
2

Самый простой способ заключается в использовать ~* оператор вместо ilike:

select id 
from friends f 
where 
    f.type = 'Close' and 
    ('BEVERAGE ALLOWED' ~* any((string_to_array(f.keywords,','))) 

Doc

или:

select id 
from friends f 
where 
    f.type = 'Close' and 
    (upper('BEVERAGE ALLOWED') SIMILAR TO '%(' || upper(replace(f.keywords,',','|')) || ')%') 

Doc

Обратите внимание, что SIMILAR TO чувствителен к регистру, поэтому мы должны использовать upper() функцию.

Однако она не работает должным образом случаи, как

select 
    'foobar' ~* any(array['FOO','BAR']), 
    'foobar' ilike any(array['%FOO%','%BAR%']); 

(оба condidions возвращает true)

Есть много способов, как ее решить. Один из возможных: Text Search:

select 
    to_tsvector('FOOBAR') @@ to_tsquery('foo|bar'), 
    to_tsvector('FOO BAR') @@ to_tsquery('foo|bar'); 

Или, по вашему запросу:

select id 
from friends f 
where 
    f.type = 'Close' and 
    (to_tsvector('BEVERAGE ALLOWED') @@ to_tsquery(replace(f.keywords,',','|')); 
Смежные вопросы