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)
--
TIP 3: Si encontraste la respuesta a tu problema, publícala, otros te lo 
agradecerán

Responder a