tabulador salto reemplazar quitar linea intermedios espacios eliminar campo buscar blanco sql oracle trim

salto - reemplazar espacios en blanco sql



Recortar espacios en blanco(espacio de nueva línea y tabulación) en una cadena en Oracle (12)

¿Para qué versión de Oracle? 10g + admite expresiones regulares: consulte este hilo en el foro de discusión de OTN para saber cómo usar REGEXP_REPLACE para cambiar los caracteres no imprimibles a '''' .

Necesito recortar New Line (Chr (13) y Chr (10) y Tab space desde el principio y el final de una cadena) en una consulta de Oracle. Aprendí que no hay una manera fácil de recortar múltiples personajes en Oracle. La función "recortar" recorta solo un carácter. Sería una degradación del rendimiento si llamo a la función de recorte recursivamente en un bucle usando una función. Escuché que regexp_replace puede hacer coincidir los espacios en blanco y eliminarlos. ¿Puede guiarse de una manera confiable de usar regexp_replace para recortar múltiples espacios de tabulación o nuevas líneas o combinaciones de ellas al principio y al final de una cadena? Si hay alguna otra manera, por favor guíame.


¿Qué hay de la función de traducción rápida y sucia?

Esto eliminará todas las apariciones de cada carácter en string1:

SELECT translate( translate( translate(string1, CHR(10), '''') , CHR(13), '''') , CHR(09), '''') as massaged FROM BLAH;

Regexp_replace es una opción, pero es posible que vea un impacto en el rendimiento según la complejidad de su expresión.


Así lo implementaría yo:

REGEXP_REPLACE(text,''(^[[:space:]]*|[[:space:]]*$)'')


El siguiente código se puede usar para eliminar la nueva línea y el espacio de tabla en la columna de texto

Select replace(replace(TEXT,char(10),''''),char(13),'''')


En los casos en que la solución de Oracle parece demasiado complicada, creo una clase java con métodos estáticos y luego la instalo como un paquete en Oracle. Es posible que esto no sea tan eficaz, pero eventualmente encontrará otros casos (por ejemplo, conversión de fecha a milisegundos) en los que encontrará útil el respaldo de Java.


En lugar de usar regexp_replace uso de tiempo múltiple (/s) como se indica a continuación;

SELECT regexp_replace(''TEXT'',''(/s)'','''') FROM dual;


Podrías usar tanto LTRIM como RTRIM.

select rtrim(ltrim(''abcdab'',''ab''),''ab'') from dual;

Si desea recortar CHR (13) solo cuando viene con un CHR (10) se vuelve más complicado. En primer lugar, tradujo la cadena combinada a un solo carácter. Luego LTRIM / RTRIM ese carácter, luego reemplace el carácter único de nuevo a la cadena combinada.

select replace(rtrim(ltrim(replace(''abccccabcccaab'',''ab'',''#''),''#''),''#''),''#'',''ab'') from dual;


Pruebe el siguiente código. Funcionará si introduce varias líneas en una sola columna.

create table products (prod_id number , prod_desc varchar2(50)); insert into products values(1,''test first test second test third''); select replace(replace(prod_desc,chr(10),'' ''),chr(13),'' '') from products where prod_id=2;

Salida: prueba primera prueba segunda prueba tercera


Sé que esta no es una respuesta estricta para esta pregunta, pero he estado trabajando en varios escenarios en los que necesita transformar datos de texto siguiendo estas reglas:

  1. No hay espacios o caracteres ctrl al principio de la cadena
  2. No hay espacios o caracteres ctrl al final de la cadena
  3. Las múltiples ocurrencias de espacios o caracteres ctrl se reemplazarán en un solo espacio

El código de abajo sigue las reglas detalladas anteriormente:

WITH test_view AS ( SELECT CHR(9) || ''Q qwer'' || CHR(9) || CHR(10) || CHR(13) || '' qwerqwer qwerty '' || CHR(9) || CHR(10) || CHR(13) str FROM DUAL ) SELECT str original ,TRIM(REGEXP_REPLACE(str, ''([[:space:]][[:space:]]+)|([[:cntrl:]]+)'', '' '')) fixed FROM test_view; ORIGINAL FIXED ---------------------- ---------------------- Q qwer Q qwer qwerqwer qwerty qwerqwer qwerty 1 row selected.


Si tiene Oracle 10g, REGEXP_REPLACE es bastante flexible.

Usando la siguiente cadena como prueba:

chr(9) || ''Q qwer'' || chr(9) || chr(10) || chr(13) || ''qwerqwer qwerty'' || chr(9) || chr(10) || chr(13)

El [[:space:]] eliminará todos los espacios en blanco, y el ([[:cntrl:]])|(^/t) regexp eliminará los caracteres y las pestañas que no se pueden imprimir.

select tester, regexp_replace(tester, ''(^[[:space:]]+)|([[:space:]]+$)'',null) regexp_tester_1, regexp_replace(tester, ''(^[[:cntrl:]^/t]+)|([[:cntrl:]^/t]+$)'',null) regexp_tester_2 from ( select chr(9) || ''Q qwer'' || chr(9) || chr(10) || chr(13) || ''qwerqwer qwerty'' || chr(9) || chr(10) || chr(13) tester from dual )

Volviendo

  • REGEXP_TESTER_1 : " Qqwerqwerqwerqwerty "
  • REGEXP_TESTER_2 : " Q qwerqwerqwer qwerty "

Espero que esto sirva para algo.


TRANSLATE (column_name, ''d''||CHR(10)||CHR(13), ''d'')

La ''d'' es un carácter ficticio, porque traducir no funciona si el tercer parámetro es nulo.


TRIM(BOTH chr(13)||chr(10)||'' '' FROM str)