Usando Postgres 9.4, ¿es posible aplicar una función en la coincidencia capturada?
Ejemplo: en mayúsculas solo la cadena que está entre comillas dobles.
SELECT regexp_replace( '123, "name", ignored~me, "Beer & Cheese", pi=3.14', '"(.+?)"', upper('"\1"'), 'g' ); --Result : '123, "name", ignored~me, "Beer & Cheese", pi=3.14' --Expected: '123, "NAME", ignored~me, "BEER & CHEESE", pi=3.14' Parece que la función que aparece en el tercer parámetro de regexp_replace se ignora. ¿Hay alguna forma de usar una función y pasar la captura de grupo \n como argumento de entrada?
Una vez tuve la misma pregunta , y esto
No obtuve la respuesta, pero tengo la impresión general de que no se supone que debes usar funciones SQL en argumentos de funciones de expresión regular...
En SQL, las funciones no son de primera clase. No se pueden pasar. Tampoco hay una parte del idioma que se interprete. Es declarativo, compilado (con un optimizador) y evaluado estrictamente.
Tenga en cuenta que, en circunstancias normales, una actualización de cualquier columna requiere volver a escribir toda la fila (no solo la columna).
Todavía puede lograr esto. Solo estaría buscando una herramienta un poco más inteligente para ello.
Aquí hay un ejemplo con plperl ,
CREATE LANGUAGE plperl; CREATE OR REPLACE FUNCTION perl_dynamic_eval_regexp_replace( IN str text, IN pattern text, IN replacementPerl text, OUT text ) STRICT AS $BODY$ my ($input, $pattern, $replacement) = @_; $input =~ s/$pattern/eval $replacement/ge; return $input; $BODY$ LANGUAGE plperl VOLATILE; SELECT perl_dynamic_eval_regexp_replace( '123, "name", ignored~me, "Beer & Cheese", pi=3.14', '"(.+?)"', $$uc("$1")$$ );