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 / 158428
Accepted
NonProphetApostle
NonProphetApostle
Asked: 2016-12-17 18:05:27 +0800 CST2016-12-17 18:05:27 +0800 CST 2016-12-17 18:05:27 +0800 CST

Dinâmico, exceto consulta PostgreSQL

  • 772

Eu sei que isso foi perguntado várias vezes no passado, desculpe pela repetição, estou apenas tentando pensar em uma solução.

Estou procurando uma maneira de consultar uma tabela excluindo uma pequena minoria das colunas sem ter que consultar o information_schema manualmente todas as vezes (uma vez que muitas das minhas tabelas consistem em 50 ou mais colunas, apenas 2-3 das quais são usadas para coisas que são irrelevantes no caso de uso desejado.)

Eu fiz isso assim:

query 1 retorna a lista de todas as colunas que existem em uma tabela menos as que você não deseja.

        CREATE OR REPLACE FUNCTION public.inverse_columns(
        _table_name text DEFAULT NULL::text,
        _col_list text[] DEFAULT NULL::text[])
      RETURNS text[] AS
    $BODY$
    DECLARE
    col_arr text[];
    BEGIN
    EXECUTE  'SELECT array_agg(column_name::text) FROM information_schema.columns
    WHERE table_name = ' ||quote_literal(_table_name) ||' AND 
    column_name NOT IN 
    ('||chr(39)|| array_to_string(_col_list, quote_literal(chr(44)))||chr(39)||');'
    INTO col_arr;

    RETURN col_arr;
    END;
    $BODY$
      LANGUAGE plpgsql IMMUTABLE
      COST 100;
    ALTER FUNCTION public.inverse_columns(text, text[])
      OWNER TO postgres;

enquanto a consulta dois usa a matriz de saída em outra consulta dinâmica para retornar o conjunto de resultados.

CREATE OR REPLACE FUNCTION public.except_select(
    _table_name text DEFAULT NULL::text,
    _col_list text[] DEFAULT NULL::text[])
  RETURNS SETOF record AS
$BODY$
DECLARE 
ret_cols text[] := inverse_columns(_table_name, _col_list);
ret_vals record;
BEGIN
RETURN QUERY
EXECUTE 'SELECT '|| quote_literal(array_to_string(ret_cols, chr(44)||chr(32))) ||
    'FROM ' || _table_name||';';
END;
$BODY$
  LANGUAGE plpgsql IMMUTABLE
  COST 100;
ALTER FUNCTION public.except_select(text, text[])
  OWNER TO postgres;

o erro que estou recebendo é esse:

ERROR:  a column definition list is required for functions returning "record"
LINE 1: SELECT * FROM except_select.....

e embora eu entenda que estou usando mal o registro, não consigo pensar em uma boa maneira de retornar um conjunto indefinido de linhas sem retornar um refcursor e usá-lo para preencher um conjunto de resultados (que é o que estou trabalhando direito agora com progresso lento, a menos que eu possa ter uma ideia melhor de como fazer isso.)

    EDIT:
few days of playing around with it and I gave up.
postgresql
  • 1 1 respostas
  • 1190 Views

1 respostas

  • Voted
  1. Best Answer
    Daniel Vérité
    2016-12-18T06:19:37+08:002016-12-18T06:19:37+08:00

    No SQL, não é possível ter uma função que descubra simultaneamente quais colunas ela deve retornar e as retorne.

    É uma consequência da regra fundamental de que a estrutura de saída de uma consulta SQL deve ser conhecida ao analisar uma consulta, antes de executá-la .

    Se o lado do cliente cooperar, isso não é um problema. Basta implementar um processo de duas etapas:

    passo 1: chamada inverse_columns()que retorna a instrução SELECT como uma string (ou apenas a lista de colunas e seu código cliente constrói o restante da instrução).

    passo #2: execute a instrução SELECT.

    Não há nenhum processo manual envolvido se você puder fazer a automação do lado do cliente.


    Por exemplo, as versões mais recentes do psql (9.6) têm uma \gexecfunção que executa uma consulta e reinjeta o resultado como uma consulta SQL.

    Retrabalhando um pouco sua except_selectfunção para retornar uma consulta em vez de uma função:

    CREATE OR REPLACE FUNCTION public.except_select(_table_name text DEFAULT NULL::text, _col_list text[] DEFAULT NULL::text[])
     RETURNS text  LANGUAGE plpgsql IMMUTABLE
    AS $function$
    DECLARE
    ret_cols text[] := inverse_columns(_table_name, _col_list);
    ret_vals record;
    BEGIN
    RETURN 'SELECT '|| array_to_string(ret_cols, chr(44)||chr(32)) ||
        ' FROM ' || _table_name;
    END;
    $function$
    

    Digamos que queremos consultar tudo , pg_stat_activityexceto o querycampo, isso pode ser escrito em psql como:

    select except_select('pg_stat_activity', '{"query"}') \gexec
    

    Resultado com exibição expandida (\x):

    -[GRAVAÇÃO 1]----+------------------------------
    dados | 12303
    nome de dados | postgres
    pid | 15175
    usesysid | 10
    nome de usuário | daniel
    application_name | psql
    cliente_addr |
    cliente_hostname |
    porta_cliente | -1
    backend_start | 17/12/2016 16:10:07.200232+01
    xact_start | 17/12/2016 16:21:10.069285+01
    query_start | 17/12/2016 16:21:10.069285+01
    mudança_de_estado | 17/12/2016 16:21:10.069288+01
    wait_event_type |
    espera_evento |
    estado | ativo
    backend_xid |
    backend_xmin | 622
    
    • 3

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

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

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

  • 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