He dado 'THOMAS,RANJAN,JDJDJDJ,OOOO'
Quiero enmascarar el 1er 3er 4to carácter con x en Postgres
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.
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;