¿Cómo escapar del guión bajo '_' en la función trim() de PostgreSQL?
Intento eliminar 'vt_' del comienzo del texto (por ejemplo 'vt_test' ) usando la función trim() :
select trim(leading 'vt_' from 'vt_test'); select ltrim('vt_test', 'vt_'); select ltrim('vt_test', 'vt\_'); select ltrim('vt_test', 'vt\\_');Devoluciones:
estPero me gustaría obtener:
test Puedo hacerlo usando replace() pero me gustaría saber por qué trim() no funciona.
Probado en Postgres 12 y 11.
RESUMEN
trim elimina todas las instancias iniciales de los caracteres enumerados; el orden de los caracteres no importa. Obtienes el mismo resultado usando trim(leading '_tv' from 'vt_test') .select regexp_replace('vt_test', '^vt_', '') porque solo quiero eliminar esta cadena inicial solo si vt_ existe al principio (lo siento, pero no no lo mencione antes).¡Gracias a_horse_with_no_name , Mureinik y Erwin Brandstetter por su ayuda!
trim() funciona como se esperaba: elimina todas las instancias principales de los caracteres enumerados. el manual :
trim([principal | final | ambos] [caracteres] de la cadena)
Elimine la cadena más larga que contenga solo caracteres de los
characters(un espacio predeterminado) desde el principio, el final o ambos extremos (bothson los valores predeterminados) de lastring
Entonces se elimina vt_t , no solo vt_ .
El problema no está relacionado con el guión bajo _ , que no tiene un significado especial en este contexto.
La alternativa más rápida para la tarea en particular:
SELECT right('vt_test', -3);El problema aquí no es escapar, ltrim es simplemente la herramienta incorrecta para el trabajo. De acuerdo con la documentación, esta función se
Elimine la cadena más larga que contenga solo caracteres de los caracteres (un espacio por defecto) desde el inicio de la cadena.
Puede usar regexp_replace para obtener el efecto deseado:
select regexp_replace('vt_test', '^vt_', '')