El 11 de septiembre de 2014, 21:50, Ivan Perales M. <ivan.pera...@gmail.com>
escribió:

> Hola buenas noches.
>
> Estoy batallando con un escenario. Estoy migrando una base de datos de H2
> database a postgresql ya que en algunas ocasiones falla por razones que no
> he podido debugear y como el tiempo es oro decidi a cambiar de base.
>
> Todo muy bien excepto por una funcion que escribi, la cual hace lo
> siguiente:
>
> Tengo una tabla con facturas, y cada factura tiene diferentes impuestos.
> Así una factura puede no tener impuestos, otras pueden tener 1 o 2 o 3 o N
> impuestos.
>
> Entonces tengo una tabla con impuestos y tengo otra tabla intermedia donde
> relaciono la factura con sus impuestos. Como las facturas las muestro en un
> paginador, hago un query como:
>
> select *, myfuncion('select impuesto, valor from tabla_intermedia where
> fac_id =' || id) from factura...
>
> myfuncion se encarga de ejecuta el query que indico, el cual como ven
> retorna dos valores por cada impuesto, la clave del impuesto y el valor del
> mismo. La funcion creada en h2 database se encarga de crear un array y
> retornarlo. Por ejemplo si una factura tiene 2 impuestos: el valor
> resultante seria: {'impuesto1', 1243.23, 'Impuesto2', 543.43}. Este
> resultado lo proceso y lo muestra en una tabla.
>
>
Para ese tipo de formato preferiría hstore. IMHO no es muy consistente
depender del orden de las variables para identificarlas (esto es, separar
por coma columnas distintas).

http://www.postgresql.org/docs/9.3/static/hstore.html

Un ejemplo:

esayuda=# select other_sol from impuestoingreso where id =4;
            other_sol
---------------------------------
 "nombre1"=>"1", "otro_imp"=>"5"
 "nombre3"=>"3", "otro_imp"=>"5"
 "nombre1"=>"3", "otro_imp"=>"5"
(3 rows)


La ventaja de este tipo es que luego puedes buscar dentro de cada valor
(además de muchas otras operaciones):

esayuda=# select other_sol->'otro_imp' from impuestoingreso where id =4;
 ?column?
----------
 5
 5
 5
(3 rows)



Otra solución más manejable es que te retorne una tabla:

esayuda=# CREATE FUNCTION sarasa (id int) RETURNS TABLE (nombreunico
text,valor double precision)
esayuda-# AS $$
esayuda$#   SELECT nombreunico,valor from impuestoingreso
esayuda$#   WHERE id = $1
esayuda$# $$
esayuda-# LANGUAGE SQL;
CREATE FUNCTION
esayuda=# select * from sarasa(4);
 nombreunico | valor
-------------+-------
 nombre1     |     1
 nombre3     |     3
 nombre1     |     3
(3 rows)




-- 
--
Emanuel Calvo http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

Responder a