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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-es-ayuda by date

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