我的查询中有一个数组元素,我需要在开始和结束时添加%。
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%}
。
但我需要在每个元素的开头和结尾添加%符号,以便数组元素为:script2
答案 0 :(得分:2)
您可以使用它来生成数组:
string_to_array('%' || replace(f.keywords, ',', '%,%') || '%', ',')
答案 1 :(得分:2)
最简单的方法是使用~*
运算符代替ilike
:
select id
from friends f
where
f.type = 'Close' and
('BEVERAGE ALLOWED' ~* any((string_to_array(f.keywords,',')))
或SIMILAR TO
:
select id
from friends f
where
f.type = 'Close' and
(upper('BEVERAGE ALLOWED') SIMILAR TO '%(' || upper(replace(f.keywords,',','|')) || ')%')
请注意,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,',','|'));