Existe alguma maneira de ter uma LIKE
consulta Postgres em um campo ARRAY?
Atualmente eu quero algo assim:
SELECT * FROM list WHERE lower(array_field) LIKE '1234%'
Atualmente mais baixo não é necessário tanto. No entanto, deve encontrar UM campo correspondente dentro do ARRAY. É mesmo possível?
Atualmente eu uso uma visão materializada para gerar a tabela "list" com um JOIN e um ARRAY_AGG()
, já que eu JOIN uma tabela onde mais valores poderiam estar na tabela certa. O que duplicaria os campos da tabela à esquerda, o que não é o que eu quero.
Edite é assim que eu crio a visão (realmente lenta e feia):
CREATE MATERIALIZED VIEW article_list_new AS
SELECT a.id,
a.oa_nr,
a.date_deleted,
a.lock,
a.sds_nr,
a.kd_art_nr,
a.kd_art_index,
a.kd_art_extend,
a.surface,
a.execution,
a.surface_area,
a.cu_thickness,
a.endintensity,
a.drilling,
array_agg(o.id::text) AS offer_list
FROM article_list a LEFT JOIN task_offer o ON o.article = a.oa_nr
GROUP BY .....;
Também preciso retornar os IDs da task_offer
tabela.
Você pode usar
unnest()
como @dezso já mencionado, por exemplo, com umaLATERAL
junção (Postgres 9.3+)Você não precisa de nada disso para o caso apresentado. Nenhuma visão materializada. Essa consulta nas tabelas subjacentes é mais rápida, pois pode usar um índice:
offer_list
é uma matriz do tipo de dados original no meu resultado e contém apenas IDs correspondentes.Retorna uma única linha de
article_list
com uma matriz de IDs correspondentes emtask_offer
. Adicione umtext_pattern_ops
índice (para correspondências ancoradas à esquerda) para obter o melhor desempenho de leitura:Ou um índice de trigramas para correspondências infixas (não ancoradas à esquerda):
Ou talvez uma junção simples para padrões seletivos:
Precisa de um índice em
article_list
, também. (O que você provavelmente tem - nenhuma informação na pergunta.) Como:Você já considerou a extensão parray_gin , também localizada aqui ?
Ainda não o usei em produção, mas pelo que vi ele faz o que você deseja contra o array. Você pode criar o índice relevante na visão materializada.
No entanto, eu só faria isso se você tivesse a visão materializada de qualquer maneira. Caso contrário, acho que a resposta do @ErwinBrandstetter é melhor do que criar uma visão materializada apenas para conter o índice.