O PostgreSQL oferece suporte a colunas computadas / calculadas, como o MS SQL Server? Não consigo encontrar nada na documentação, mas como esse recurso está incluído em muitos outros DBMSs, pensei que poderia estar faltando alguma coisa.
Por exemplo: http://msdn.microsoft.com/en-us/library/ms191250.aspx
postgresql
calculated-columns
sql-view
materialized-views
generated-columns
Mike Chamberlain
fonte
fonte
Respostas:
Até Postgres 11 colunas geradas não são suportadas - conforme definido no padrão SQL e implementado por alguns RDBMS incluindo DB2, MySQL e Oracle. Nem as semelhantes "colunas computadas" do SQL Server.
STORED
colunas geradas são introduzidas com Postgres 12 . Exemplo trivial:db <> fiddle aqui
VIRTUAL
colunas geradas podem vir com uma das próximas iterações. (Não no Postgres 13, ainda).Relacionado:
Até então , você pode emular
VIRTUAL
colunas geradas com uma função usando notação de atributo (tbl.col
) que parece e funciona muito como uma coluna gerada virtual . Essa é uma peculiaridade de sintaxe que existe no Postgres por razões históricas e que se encaixa no caso. Esta resposta relacionada tem exemplos de código :A expressão (parecida com uma coluna) não está incluída em a
SELECT * FROM tbl
, no entanto. Você sempre tem que listar explicitamente.Também pode ser compatível com um índice de expressão correspondente - desde que a função seja
IMMUTABLE
. Gostar:Alternativas
Como alternativa, você pode implementar uma funcionalidade semelhante com um
VIEW
, opcionalmente acoplado a índices de expressão. Em seguida,SELECT *
pode incluir a coluna gerada.As
STORED
colunas computadas "Persisted" ( ) podem ser implementadas com gatilhos de maneira funcionalmente idêntica.As visualizações materializadas são um conceito intimamente relacionado, implementado desde o Postgres 9.3 .
Em versões anteriores, pode-se gerenciar MVs manualmente.
fonte
Sim você pode!! A solução deve ser fácil, segura e eficiente ...
Eu sou novo no postgresql, mas parece que você pode criar colunas computadas usando um índice de expressão , emparelhado com uma visão (a visão é opcional, mas torna a vida um pouco mais fácil).
Suponha que meu cálculo seja
md5(some_string_field)
, então eu crio o índice como:Agora, qualquer consulta que atue
MD5(some_string_field)
usará o índice em vez de computá-lo do zero. Por exemplo:Você pode verificar isso com o explain .
Entretanto, neste ponto, você está contando com os usuários da tabela que sabem exatamente como construir a coluna. Para tornar a vida mais fácil, você pode criar um
VIEW
em uma versão aumentada da tabela original, adicionando o valor calculado como uma nova coluna:Agora, qualquer consulta usando
some_table_augmented
poderá usarsome_string_field_md5
sem se preocupar com como funciona ... eles apenas obtêm um bom desempenho. O modo de exibição não copia nenhum dado da tabela original, por isso é bom em termos de memória e também de desempenho. Observe, no entanto, que você não pode atualizar / inserir em uma exibição, apenas na tabela de origem, mas se você realmente quiser, acredito que você pode redirecionar inserções e atualizações para a tabela de origem usando regras (posso estar errado nesse último ponto, pois Nunca tentei sozinho).Editar: parece que se a consulta envolver índices concorrentes, o motor do planejador pode às vezes nem usar o índice de expressão. A escolha parece ser dependente dos dados.
fonte
if the query involves competing indices
?Uma maneira de fazer isso é com um gatilho!
O gatilho é disparado antes que a linha seja atualizada ou inserida. Ele altera o campo que queremos calcular de
NEW
registro e, em seguida, retorna esse registro.fonte
insert into computed values(1, 2); insert into computed values(4, 8); commit; select * from computed;
e acabou de retornar: 1 2 e 4 8insert into computed(one) values(1); insert into computed(one) values(4); commit; select * from computed;
o valor datwo
coluna será calculado automagicamente!PostgreSQL 12 suporta colunas geradas:
db <> demonstração de violino
fonte
Bem, não tenho certeza se é isso que você quer dizer, mas Posgres normalmente suporta sintaxe ETL "fictícia". Eu criei uma coluna vazia na tabela e então precisei preenchê-la com registros calculados dependendo dos valores na linha.
fonte
Eu tenho um código que funciona e uso o termo calculado, não estou no postgresSQL puro embora rodemos no PADB
aqui está como é usado
fonte
Uma solução leve com restrição de verificação:
fonte
field as 1 persisted
.