Skip site navigation (1) Skip section navigation (2)

Re: campo tipo text...

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Luis Esteban <esteban(at)princesa(dot)pri(dot)sld(dot)cu>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: campo tipo text...
Date: 2010-01-06 13:52:26
Message-ID: 20100106135226.GA6129@alvh.no-ip.org (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Luis Esteban escribió:
> Hola Alvaro,
> 
> Te escribo porque estoy escribiendo a la lista desde por la mañana,
> varias veces, y no veo que mi mensaje llegue pues no lo recibo, sin
> embargo recibo mensajes de la lista de postgre. No se qué me está
> pasando.

Hmm, supongo que el problema es que el antispam de postgresql.org se
está comiendo tu mensaje :-(

> Tengo un problemita que no he podido resolver y tengo urgencia con esto en
> mi laburo, así que recurro a la cortesía de mis colisteros.
> 
> En un campo tipo text tengo guardados muchos pares parámetros-valor, todos
> en una misma cadena pero separados por '\n', por ejemplo:
> 
> 'mostrar_titulo_pagina=1\ntitulo_pagina=Bienvenidos mi
> sitio\nmostrar_descripcion=0\n\n'
> 
> Quisiera poder cambiar el valor de uno de esos parámetros sin alterar los
> demás.

Uf.  Como diseño, es bastante malo, precisamente porque es muy difícil
hacer modificaciones en los valores, hacer chequeos de integridad, o
hacer búsquedas en los valores.  Te recomendaría migrarlo, la solución
menos mala que se me ocurre es contrib/hstore que permite almacenar
columnas que son conjuntos de llave/valor como las tuyas, pero es más
funcional.

Para modificar esto yo usaría string_to_array(tu-string, '\n'), luego
unnest, y eso lo mezclaria con WITH para luego hacer split_part y tener
los valores en forma de tabla, mas manipulable:

alvherre=# with a as (select unnest(string_to_array(E'mostrar_titulo_pagina=1\ntitulo_pagina=Bienvenidos mi sitio\nmostrar_descripcion=0\n\n', E'\n')) as val) select split_part(val, '=', 1), split_part(val, '=', 2) from a;
      split_part       |      split_part      
-----------------------+----------------------
 mostrar_titulo_pagina | 1
 titulo_pagina         | Bienvenidos mi sitio
 mostrar_descripcion   | 0
                       | 
                       | 
(5 filas)


Luego eso lo puedes poner en un subselect y cambiar el valor que
quieres, para despues hacer una concatenacion para pegar los valores con
= y luego juntarlo todo con array_agg() y array_to_string() para pegarlo
todo de vuelta en una sola cadena.

Conclusion: cambia el modelo

-- 
Alvaro Herrera       Vendo parcela en Valdivia:
http://valdivia.vivastreet.cl/loteos-lotes+valdivia/parcela-en-cabo-blanco--valdivia/19288372
"Right now the sectors on the hard disk run clockwise, but I heard a rumor that
you can squeeze 0.2% more throughput by running them counterclockwise.
It's worth the effort. Recommended."  (Gerry Pourwelle)

Responses

pgsql-es-ayuda by date

Next:From: Daniela Mamede d'AlmeidaDate: 2010-01-06 15:05:29
Subject: Vistas materializadas
Previous:From: Edwin QuijadaDate: 2010-01-05 22:26:21
Subject: RE: Postgre en Linux

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group