Hola, :)
Hmm, supongo que el problema es que el antispam de postgresql.org se
está comiendo tu mensaje :-(
Perdona que te vuelva a escribir al privado, quisiera ver si por fin se
resuelve mi prolema con respecto a los mensajes que envío a la lista.
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.
Alvaro, me explico más. EL software es un sitio Joomla(me pidieron
diseñarlo con el), específicamente en su v.1.5.15, y por supuesto la bd es
mysql pero este tipo de campo tiene su igual en postgresql, por eso
escribí acá pues no estoy en listas de mysql. Así que ya entenderás porque
no puedo cambiar el diseño. Yo he resuelto cambiando el parámetro en el
script que crea la bd antes de instalar pero quiero aprender cosas de
avanzadas como estas, en caliente, desde el cliente de mysql o postgresql.
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.
Entonces, ¿esto me serviría?. Estoy ancioso por probar.
--
Saludos,
Luis Esteban
--
Este mensaje le ha llegado mediante el servicio de correo electronico que
ofrece Infomed para respaldar el cumplimiento de las misiones del Sistema
Nacional de Salud. La persona que envia este correo asume el compromiso de usar
el servicio a tales fines y cumplir con las regulaciones establecidas
Infomed: http://www.sld.cu/
--
TIP 9: visita nuestro canal de IRC #postgresql-es en irc.freenode.net