AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 117740
Accepted
Christian Schmitt
Christian Schmitt
Asked: 2015-10-13 05:16:02 +0800 CST2015-10-13 05:16:02 +0800 CST 2015-10-13 05:16:02 +0800 CST

Consulta PostgreSQL LIKE no campo ARRAY

  • 772

Existe alguma maneira de ter uma LIKEconsulta 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_offertabela.

database-design postgresql
  • 2 2 respostas
  • 28415 Views

2 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2015-10-13T05:50:38+08:002015-10-13T05:50:38+08:00

    Você pode usar unnest()como @dezso já mencionado, por exemplo, com uma LATERALjunção (Postgres 9.3+)

    SELECT l.*
    FROM   list l, unnest(array_field) a  -- implicit lateral
    WHERE  lower(a) LIKE '1234%';
    

    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:

    SELECT *  -- or selected columns
    FROM   article_list a
    JOIN   LATERAL  (                      -- only matching IDs
       SELECT array_agg(id) AS offer_list
       FROM   task_offer
       WHERE  article = a.oa_nr            -- LATERAL reference  
       AND    id::text ILIKE '1234%'       -- or just LIKE
       ) o ON offer_list IS NOT NULL;
    

    offer_listé uma matriz do tipo de dados original no meu resultado e contém apenas IDs correspondentes.

    Retorna uma única linha de article_listcom uma matriz de IDs correspondentes em task_offer. Adicione um text_pattern_opsíndice (para correspondências ancoradas à esquerda) para obter o melhor desempenho de leitura:

    CREATE INDEX task_offer_foo_idx ON task_offer (article, (id::text) text_pattern_ops);
    
    • Correspondência de padrões com LIKE, SIMILAR TO ou expressões regulares no PostgreSQL

    Ou um índice de trigramas para correspondências infixas (não ancoradas à esquerda):

    • Como o LIKE é implementado?

    Ou talvez uma junção simples para padrões seletivos:

    SELECT a.*, o.offer_list -- or selected columns
    FROM   article_list a
    JOIN   (                          -- only matching IDs
       SELECT article, array_agg(id) AS offer_list
       FROM   task_offer
       WHERE  id::text ILIKE '1234%'  -- or just LIKE
       GROUP  BY 1
       ) o ON o.article = a.oa_nr;
    

    Precisa de um índice em article_list, também. (O que você provavelmente tem - nenhuma informação na pergunta.) Como:

    CREATE INDEX article_list_oa_nr_idx ON article_list (oa_nr);
    
    • 15
  2. jjanes
    2015-10-13T14:41:34+08:002015-10-13T14:41:34+08:00

    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.

    • 4

relate perguntas

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve