Campo calculado

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Campo calculado

Rogério Martins
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

_______________________________________________
pgbr-geral mailing list
[hidden email]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Reply | Threaded
Open this post in threaded view
|

Re: Campo calculado

Mario Castro Oficial
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

 


Em 18 de abril de 2018 08:29, Rogério Martins <[hidden email]> escreveu:
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

_______________________________________________
pgbr-geral mailing list
[hidden email]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


_______________________________________________
pgbr-geral mailing list
[hidden email]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Reply | Threaded
Open this post in threaded view
|

Re: Campo calculado

hereibi
In reply to this post by Rogério Martins
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



Em 18 de abril de 2018 08:29, Rogério Martins <[hidden email]> escreveu:
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

_______________________________________________
pgbr-geral mailing list
[hidden email]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


_______________________________________________
pgbr-geral mailing list
[hidden email]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Reply | Threaded
Open this post in threaded view
|

Re: Campo calculado

Osvaldo Kussama
In reply to this post by Rogério Martins
Em 18/04/2018, Rogério Martins<[hidden email]> escreveu:

> 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.
>


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
_______________________________________________
pgbr-geral mailing list
[hidden email]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Reply | Threaded
Open this post in threaded view
|

Re: Campo calculado

Arthur Nascimento
In reply to this post by Rogério Martins
2018-04-18 8:29 GMT-03:00 Rogério Martins <[hidden email]>:

> 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.

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
_______________________________________________
pgbr-geral mailing list
[hidden email]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Reply | Threaded
Open this post in threaded view
|

Re: Campo calculado

Flavio Henrique Araque Gurgel

> 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

_______________________________________________
pgbr-geral mailing list
[hidden email]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral