Postgresql:将%附加到数组元素的开头和结尾

时间:2016-12-13 10:03:51

标签: postgresql

我的查询中有一个数组元素,我需要在开始和结束时添加%。

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

2 个答案:

答案 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,',')))

Doc

SIMILAR TO

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,',','|'));