Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

300
Vistas
¿Cómo se puede usar 'regexp_replace ()' para reemplazar desde la posición inicial hasta la posición final en PostgreSQL?

He dado 'THOMAS,RANJAN,JDJDJDJ,OOOO'

Quiero enmascarar el 1er 3er 4to carácter con x en Postgres

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Si desea que el reemplazo ocurra para las cuatro partes separadas por comas, puede usar algo como esto:

 WITH mytable(mystring) AS (SELECT 'THOMAS,RANJAN,JDJDJDJ,OOOO'::text) SELECT string_agg( overlay( overlay( ap placing 'x' from 1 for 1 ) placing 'xx' from 3 for 2 ), ',' ) FROM mytable CROSS JOIN LATERAL unnest(string_to_array(mystring, ',')) a(p);

Eso resulta en

 ┌────────────────────────────┐ │ string_agg │ ├────────────────────────────┤ │ xHxxAS,xAxxAN,xDxxJDJ,xOxx │ └────────────────────────────┘ (1 row)

Si no necesita que el reemplazo ocurra para todas las partes, sino para toda la cadena, simplemente use las dos overlay y olvídese del resto.

over 4 years ago · Santiago Trujillo Denunciar

0

También puede usar expresiones regulares. Una expresión regular para obtener los lugares de inserción (donde debería estar x) y otra para obtener el resto de subcadenas (donde el texto debería permanecer intacto).

Lo siguiente debería funcionar también para cadenas más cortas.

SELECT test.replace_string_134('THOMAS,RANJAN,JDJDJDJ,OOOO,b,bl,bla');

rendimiento: xHxxAS,xAxxAN,xDxxJDJ,xOxx,x,xl,xlx

Publico esto como una muestra alternativa, pero en cuanto al rendimiento, puede seguir la respuesta de @LaurenzAlbe.

 CREATE SCHEMA test; CREATE OR REPLACE FUNCTION test.replace_string_134 (TEXT) RETURNS TEXT AS $$ DECLARE input_text ALIAS FOR $1; BEGIN RETURN ( SELECT STRING_AGG( CASE WHEN tgroup.txt_group[1] <> '' THEN 'x' ELSE '' END || trest.txt_rest[1] || CASE WHEN tgroup.txt_group[2] <> '' THEN 'x' ELSE '' END || CASE WHEN tgroup.txt_group[3] <> '' THEN 'x' ELSE '' END || trest.txt_rest[2], ',') FROM ( SELECT txt_group, ROW_NUMBER() OVER () AS txt_index FROM regexp_matches(input_text, '[,]?([^,])[^,]?([^,]?)([^,]?)[^,]*[,]?', 'g') AS txt_group ) AS tgroup INNER JOIN ( SELECT txt_rest, ROW_NUMBER() OVER () AS txt_index FROM regexp_matches(input_text, '[,]?[^,]([^,]?)[^,]?[^,]?([^,]*)[,]?', 'g') AS txt_rest ) AS trest ON trest.txt_index = tgroup.txt_index ); END $$ LANGUAGE plpgsql; SELECT test.replace_string_134('THOMAS,RANJAN,JDJDJDJ,OOOO,b,bl,bla'); DROP SCHEMA test CASCADE;
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda