RE: problema usando regexp_replace

From: gherzig(at)fmed(dot)uba(dot)ar
To: "Fernando Hevia" <fhevia(at)ip-tel(dot)com(dot)ar>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: RE: problema usando regexp_replace
Date: 2010-01-12 16:21:00
Message-ID: 4aad1cf76d57da61c3eb42117e9205f8.squirrel@www.webmail.fmed.uba.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

>
>
>> -----Mensaje original-----
>> De: gherzig(at)fmed(dot)uba(dot)ar
>>
>> Hola a todos/as: Estoy aqui con una funcion que utiliza
>> regexp_replace, pero en lugar de sustituir por un texto,
>> quiero sustituir por el resultado de otra funcion, pasandole
>> como argumentos, lo que capture previamente (en
>> 2 grupos)
>>
>> Este es un pequeño ejemplo con un registro cualquiera:
>> SELECT formato from tabla where id=1;
>> <TR><TD>{Funcion_1.842}</TD></TR></TBODY></TABLE><TABLE><TBODY
>><TR><TD>{Funcion_2.842A}</TD>[snip]
>>
>> La idea es tomar eso que esta entre {}, lo que esta a la
>> izquierda del punto es el primer argumento, y el resto el
>> segundo argumento para pasarles a la "funcion reemplazadora".
>>
>> *Para simplificar*, la "funcion reemplazadora" solo hace esto:
>> CREATE OR REPLACE FUNCTION
>> valores_sustitucion(valor_ingresado varchar[]) ...
>> select case $1[1] when 'Funcion_1' then 'UNO'
>> when 'Funcion_2' then 'DOS'
>> else $1[1] || ',SALIOPORELSE'
>> end;
>>
>> Entonces, aqui es donde uso regexp_replace:
>> SELECT regexp_replace(formato,
>> E'{([^.]*)\.([a-zA-Z0-9]*)}',
>> valores_sustitucion(ARRAY[E'\\1',E'\\2']), 'g')
>> from tabla where id=1;
>>
>> Aqui capturo en el primer grupo lo que esta antes del punto,
>> el resto en el segundo grupo, y se los paso como argumentos a
>> valores_sustitucion...
>> Pero no hace lo que quiero, pues..
>> <TR><TD>Funcion_1,SALIOPORELSE</TD></TR></TBODY></TABLE><TABLE
>><TBODY><TR><TD>Funcion_2,SALIOPORELSE[snip]
>>
>> O sea, el case no captura Funcion_1, ni Funcion_2, y sale por
>> el ELSE...
>> No logro comprender donde esta mi error.
>> Consejos, opiniones, seran bienvenidas!
>>
>
> Diabólico! Hubiera jurado que el problema estaba en comparar elementos de
> un
> array de varchars con text, pero no. Pasé todo a text, forcé casts por
> todos
> lados sin efecto y el problema persiste.
> En cambio la llamada SELECT valores_sustitucion(ARRAY['Funcion_1',
> 'valor'])
> funciona correctamente.
>
> Me lleva a pensar que el \n del regexp_replace no está funcionando como
> esperábamos.
>
> ¿Habrás encontrado un bug? Creo que merece ser consultado en la lista
> pgsql-sql(at)postgresql(dot)org(dot)
>
> Saludos,
> Fernando.
>
> --
> TIP 1: para suscribirte y desuscribirte, visita
> http://archives.postgresql.org/pgsql-es-ayuda
>
>
Oh, justamente aqui alguien de la lista internacional me contesto, parece
que mi primero ejecuta la funcion, y luego le pasa el resultado a
regexp_replace. No me convencio, pero le encontro una manera de
resolverlo, que no parece muy performante, pero funciona:

create OR REPLACE function magic( inp text ) returns text as $F$
DECLARE
tmp text;
res text;
BEGIN
tmp= 'SELECT ' ||
regexp_replace(quote_literal(inp),E'{([^.]*)\.([a-zA-Z0-9]*)}',
$s$'|| valores_sustitucion(ARRAY[E'\1',E'\2']) ||'$s$,'g');
-- raise notice 'tmp=%',(tmp);
EXECUTE tmp INTO res;
RETURN res;
END;
$F$ language plpgsql;

O sea, arma todo un gran string, medio esoterico, pero funciona!

Gracias Fernando!
Gerardo

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message (Syswarp) Carlos Enrique Perez 2010-01-12 16:37:19 RE: Vistas materializadas
Previous Message Yudelsy Castellón García 2010-01-12 16:14:23 RV: RV: RV: duda con funcion