Discussion:
[pgbr-geral] Campo calculado
Rogério Martins
2018-04-18 11:29:40 UTC
Permalink
Bom dia pessoal !

É possível criar no PG 9.6 um campo calculado ?
Exemplo:

select
t.data_nascimento,
t.campo_calculado_idade,
from tabela t

onde:
t.campo_calculado_idade = date_part('year', age(t.data_nascimento) )

Não quero usar view, preciso desse campo na tabela.

Obrigado
--
The Ubuntu Counter Project - user number # 33192
<http://ubuntucounter.geekosophical.net>
Mario Castro Oficial
2018-04-18 11:45:48 UTC
Permalink
Basicamente você deverá cria uma function e uma trigger e toda vez que
houver o evento insert e ou update executar'aa função que calculará o
resultado no campo.

No exemplo abaixo a coluna3 é calculada a partir de uma somatoria dos
valores da coluna1 e coluna2, porém vc ajusta a realidade de seu cauculo

funcão:

CREATE OR REPLACE FUNCTION "public"."calcular" () RETURNS trigger AS'
begin
if (new.coluna1 is null) or (new.coluna2 is null) then
Raise notice ''Factores para o calculo nulos'';
new.coluna3 := 0;
else
new.coluna3 := (new.coluna1 + new.coluna2);
end if;
return new;
end;
'LANGUAGE 'plpgsql' IMMUTABLE CALLED ON NULL INPUT SECURITY INVOKER;


trigger:

CREATE TRIGGER "fazcalculo" BEFORE INSERT OR UPDATE
ON "public"."nomeTabela" FOR EACH ROW
EXECUTE PROCEDURE "public"."calcular"();



Atenciosamente,

*Mário R. de Castro*
Post by Rogério Martins
Bom dia pessoal !
É possível criar no PG 9.6 um campo calculado ?
select
t.data_nascimento,
t.campo_calculado_idade,
from tabela t
t.campo_calculado_idade = date_part('year', age(t.data_nascimento) )
Não quero usar view, preciso desse campo na tabela.
Obrigado
--
The Ubuntu Counter Project - user number # 33192
<http://ubuntucounter.geekosophical.net>
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Amir
2018-04-18 11:49:54 UTC
Permalink
Boam dia... Rogério Martins

Eu usaria isso... faz o mesmo resultado.... ou o campo tem que ser guardado
na tabela?

select
t.data_nascimento,
date_part('year', age(t.data_nascimento) ) as t.campo_calculado_idade
from tabela t
Post by Rogério Martins
Bom dia pessoal !
É possível criar no PG 9.6 um campo calculado ?
select
t.data_nascimento,
t.campo_calculado_idade,
from tabela t
t.campo_calculado_idade = date_part('year', age(t.data_nascimento) )
Não quero usar view, preciso desse campo na tabela.
Obrigado
--
The Ubuntu Counter Project - user number # 33192
<http://ubuntucounter.geekosophical.net>
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Osvaldo Kussama
2018-04-18 12:53:14 UTC
Permalink
Post by Rogério Martins
Bom dia pessoal !
É possível criar no PG 9.6 um campo calculado ?
select
t.data_nascimento,
t.campo_calculado_idade,
from tabela t
t.campo_calculado_idade = date_part('year', age(t.data_nascimento) )
Não quero usar view, preciso desse campo na tabela.
Lembre-se de que incluir um campo calculado a partir de outro(s)
campo(s) de sua tabela vai contra as regras de normalização que são
fundamentais para um bom projeto de banco de dados.

Osvaldo
Arthur Nascimento
2018-04-18 15:15:53 UTC
Permalink
Post by Rogério Martins
Bom dia pessoal !
É possível criar no PG 9.6 um campo calculado ?
select
t.data_nascimento,
t.campo_calculado_idade,
from tabela t
t.campo_calculado_idade = date_part('year', age(t.data_nascimento) )
Não quero usar view, preciso desse campo na tabela.
Sim. A longo prazo, o que você procura é GENERATED COLUMNS, que está
no padrão SQL. Infelizmente não vai entrar nem na v11, mas quem sabe
no futuro. Recomendo dar uma lida na thread de e-mail daqui: [1]

Mas além dos triggers que já disseram aqui, tem um outro truque
abusando da resolução de funções no postgres. É descrito na primeira
resposta da thread principal da feature.

[1] https://commitfest.postgresql.org/17/1443/


Tureba - Arthur Nascimento
Flavio Henrique Araque Gurgel
2018-04-18 15:29:15 UTC
Permalink
Post by Rogério Martins
Não quero usar view, preciso desse campo na tabela.
O OP poderia nos explicar por que não é possível (ou nas suas palavras, por
que "não quer") usar uma view? Sua simples frase me parece meio agressiva.

Não tem explicação lógica... a única que vejo é que você tem uma aplicação
"imutável" onde o código fonte não está disponível. Nesse caso, você pode
renomear a tabela original, criar a view com o mesmo nome da tabela sobre a
tabela renomeada, acrescentando seu campo calculado, e usar o sistema de
rules para direcionar as operações de modificação para a tabela renomeada,
simples assim.

Me parece um clássico problema XY [1] (em inglês apenas)

[]s
Flavio Gurgel

[1] https://en.wikipedia.org/wiki/XY_problem

Continue reading on narkive:
Loading...