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