Existe um caminho para SELECT
todas as colunas em uma tabela, exceto as específicas? Seria muito conveniente selecionar todas as colunas não-blob ou não-geométricas de uma tabela.
Algo como:
SELECT * -the_geom FROM segments;
- Uma vez ouvi dizer que essa funcionalidade foi deliberadamente excluída do padrão SQL porque a alteração da adição de colunas na tabela alterará os resultados da consulta. Isso é verdade? O argumento é válido?
- Existe uma solução alternativa, especialmente no PostgreSQL?
postgresql
sql-standard
Adam Matan
fonte
fonte
name
,age
,sid
) que se encaixa bem na largura da tela, alongwith um binário longogeom
da coluna. Eu quero consultar todos os campos, exceto o binário da geometria, e escrever seus nomes um por um é entediante.select (!coluns2,!column5) from sometable;
Respostas:
Esse recurso não existe no Postgres nem no SQL Standard (AFAIK). Eu acho que essa é uma pergunta bastante interessante, então pesquisei um pouco no Google e me deparei com um artigo interessante no postgresonline.com .
Eles mostram uma abordagem que seleciona as colunas diretamente do esquema:
Você pode criar uma função que faça algo assim. Esses tópicos também foram discutidos nas listas de discussão, mas o consenso geral era praticamente o mesmo: consultar o esquema.
Tenho certeza de que existem outras soluções, mas acho que todas elas envolverão algum tipo de esquema mágico-consulta-foo.
BTW: tenha cuidado,
SELECT * ...
pois isso pode ter penalidades de desempenhofonte
A resposta real é que você simplesmente não pode praticamente. Esse é um recurso solicitado há décadas e os desenvolvedores se recusam a implementá-lo.
A resposta popular que sugere consultar as tabelas de esquema não poderá ser executada com eficiência, porque o otimizador do Postgres considera as funções dinâmicas uma caixa preta (veja o caso de teste abaixo). Isso significa que os índices não serão usados e as junções não serão feitas de maneira inteligente. Você seria muito melhor com algum tipo de sistema macro como o m4. Pelo menos, não confundirá o otimizador (mas ainda poderá confundi-lo.) Sem bifurcar o código e escrever o recurso você mesmo ou usar uma interface de linguagem de programação, você está preso.
Eu escrevi uma prova simples de conceito abaixo, mostrando o quão ruim seria o desempenho com uma execução dinâmica muito simples no plpgsql. Observe também que abaixo eu tenho que coagir uma função retornando um registro genérico em um tipo de linha específico e enumerar as colunas. Portanto, esse método não funcionará para 'selecionar tudo menos', a menos que você queira refazer esta função para todas as suas tabelas.
Como você pode ver, a chamada de função varreu a tabela inteira enquanto a consulta direta usava o índice ( 95,46 ms vs. 00,07 ms .) Esses tipos de funções armazenariam qualquer tipo de consulta complicada que precisasse usar índices ou ingressar em tabelas na ordem correta .
fonte
Na verdade, é algo possível com o PostgreSQL, começando com a 9.4, onde o JSONB foi introduzido. Eu estava pensando em uma pergunta semelhante sobre como mostrar todos os atributos disponíveis no Google Map (via GeoJSON).
johto no canal irc sugeriu tentar excluir o elemento do JSONB.
Aqui está a ideia
Enquanto você obtém json em vez de colunas individuais, era exatamente o que eu queria. Talvez o json possa ser expandido novamente em colunas individuais.
fonte
A única maneira de você (não dizer que deveria) fazer isso é usando instruções sql dinâmicas. É fácil (como escreveu o DrColossos) consultar as visualizações do sistema e encontrar a estrutura da tabela e criar instruções apropriadas.
PS: Por que você deseja selecionar todas / algumas colunas sem saber / escrever exatamente a estrutura da sua tabela?
fonte
Dinamicamente, como indicado acima, é a única resposta, mas não a recomendo. E se você adicionar mais colunas a longo prazo, mas elas não forem necessariamente necessárias para essa consulta?
Você começaria a puxar mais coluna do que precisa.
E se o select fizer parte de uma inserção como em
Inserir na tabelaA (col1, col2, col3 .. coln) Selecionar tudo, exceto 2 colunas DA tabelaB
A correspondência da coluna estará incorreta e sua inserção falhará.
É possível, mas ainda recomendo escrever todas as colunas necessárias para cada seleção gravada, mesmo que quase todas as colunas sejam necessárias.
fonte
SELECT
s.Se seu objetivo é remover a confusão da tela durante a depuração, não exibindo colunas com grandes valores de dados, você pode usar o seguinte truque:
(instale o pacote contrib "hstore" se você ainda não o possui: "
CREATE EXTENSION hstore;
")Para uma tabela "test" com col1, col2, col3, você pode definir o valor de "col2" como nulo antes de exibir:
Ou defina duas colunas como nulas antes de exibir:
a ressalva é que "teste" deve ser uma tabela (um alias ou subseleção não funcionará), pois o tipo de registro que alimenta o hstore deve ser definido.
fonte
Há uma solução alternativa que acabei de descobrir, mas requer o envio de consultas SQL de dentro de R. Pode ser útil para usuários de R.
Basicamente, o
dplyr
pacote envia consultas SQL (e especificamente PostgreSQL) e aceita o-(column_name)
argumento.Portanto, seu exemplo pode ser escrito da seguinte maneira:
fonte
Em um comentário, você explica que seu motivo é ter a conveniência de não exibir o conteúdo de colunas com conteúdo longo, em vez de não exibir a própria coluna:
Isso é possível, com a ajuda de uma função auxiliar que substitui o conteúdo longo por
null
(qualquertext
coluna no meu exemplo, mas você modificaria isso para os tipos que deseja suprimir):dbfiddle aqui
fonte
Do ponto de vista da aplicação, esta é uma solução lenta. É improvável que um aplicativo saiba automaticamente o que fazer com as novas colunas.
Os aplicativos de navegador de dados podem consultar os metadados para os dados e excluir as colunas das consultas que estão sendo executadas ou selecionar um subconjunto dos dados da coluna. Novos BLOBs podem ser excluídos quando adicionados. Dados BLOB para linhas específicas podem ser selecionados sob demanda.
Em qualquer variante SQL que suporte consultas dinâmicas, a consulta pode ser criada usando uma consulta nos metadados da tabela. Para sua intenção, excluiria colunas com base no tipo e não no nome.
fonte
Você nunca vê
*
no SQL-VIEWS ... verifique\d any_view
no seupsql
. Há um pré - processamento (introspectivo) para representação interna.Toda discussão aqui mostra que a proposta do problema (implícita na pergunta e nas discussões) é um açúcar de sintaxe para os programadores, não um "problema de otimização de SQL" real ... Bem, meu palpite, é para 80% dos programadores.
Portanto, pode ser implementado como " pré-análise com introspecção" ... Veja o que o PostgreSQL faz quando declara um SQL-VIEW com
SELECT *
: o construtor VIEW se transforma*
em uma lista de todas as colunas (por introspecção e no momento em que você executa o CRIAR código-fonte VIEW).Implementação para CREATE VIEW e PREPARE
É uma implementação viável. Suponha tabela
t
com campos(id serial, name text, the_geom geom)
.O mesmo para a declaração PREPARE .
... então, isso é possível, e é disso que 80% dos programadores precisam, um açúcar de sintaxe para PREPARE e VIEWS!
NOTA: é claro que a sintaxe viável , talvez, não é
- column_name
, se houver algum conflito no PostgreSQL, para que possamos sugerirEXCEPT column_name
,EXCEPT (column_name1, column_name2, ..., column_nameN)
ou outro.fonte
Esta é a minha função para selecionar todas as colunas esperadas uma. Combinei idéias de postgresonline.com e postgresql tuturial e de outras fontes.
fonte