Пока единственное, что вы можете сделать, - это развернуть массив и проверить каждый элемент:
create table test (a text[]);
insert into test values (array['abc', 'def', 'ghi']);
select distinct a from test
JOIN lateral (select * from unnest(a) as u) as sub on TRUE
WHERE u like '%g';
a
---
(0 rows)
select distinct a from test
JOIN lateral (select * from unnest(a) as u) as sub on TRUE
WHERE u like 'g%';
a
---------------
{abc,def,ghi}
(1 row)
В postgres 12 вы сможете использовать jsonb_path_exists. Конечно, это будет работать лучше, если вы сохраните свои данные в jsonb, но все равно будет работать, но не так эффективно:
-- Starts with g
select a from test
where jsonb_path_exists(to_jsonb(a), '$[*] ? (@ like_regex "^g")');
a
---------------
{abc,def,ghi}
(1 row)
-- Ends with g
select a from test
where jsonb_path_exists(to_jsonb(a), '$[*] ? (@ like_regex "g$")');
a
---
(0 rows)