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

Necesito recortar New Line (Chr (13) y Chr (10) y el espacio de tabulación desde el principio y el final de una cadena) en una consulta de Oracle. Aprendí que no hay una manera fácil de recortar varios caracteres en Oracle. La función "recortar" recorta sólo un carácter. Sería una degradación del rendimiento si llamo a la función trim de manera recursiva en un bucle usando una función. Escuché que regexp_replace puede hacer coincidir los espacios en blanco y eliminarlos. ¿Puede guiarnos de una manera confiable de usar regexp_replace para recortar múltiples espacios de pestañas o nuevas líneas o combinaciones de ellos al principio y al final de una cadena? Si hay alguna otra forma, por favor guíeme.

preguntado el 15 de febrero de 10 a las 18:02

La función "recortar" no solo elimina un solo carácter. Elimina todos los espacios en blanco. -

Hola Seshan. ¿Alguna de las siguientes respuestas te resultó útil? -

Voy a comprobar eso. Lo comprobaré y te lo haré saber .. -

15 Respuestas

¿Qué tal 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 dependiendo de qué tan compleja sea su expresión.

Respondido 15 Feb 10, 21:02

Esto está mal en dos niveles. En primer lugar, siempre que pase null (p. Ej. '') como tercer parámetro para TRADUCIR, siempre devolverá nulo. En segundo lugar, TRANSLATE actúa sobre toda la cadena, no solo el principio y el final de una cadena (como lo solicita OP). Referir: docs.oracle.com/cd/E11882_01/server.112/e10592/… - jeffrey kemp

Jeffrey tiene razón al decir que esto no funciona, a menos que reemplace "con" (espacio en blanco). Además, translate permite especificar que se reemplacen varios caracteres a la vez. Esto hace lo mismo: seleccione trim (translate ('example', chr (10) || chr (13) || chr (09), '')) como ejemplo de dual; Tenga en cuenta que aún reemplaza estos caracteres, en todas partes, en la cadena. - Wouter

Hmm, los comentarios de desbordamiento de pila reemplazan espacios consecutivos con solo uno. Debe haber tres espacios entre '' en la declaración SQL anterior. - Wouter

Gracias. fue útil pero es mejor usar REPLACE en lugar de TRANSLATE. - Hadi Momenzadeh

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 impriman.

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.

Respondido el 06 de enero de 16 a las 09:01

Se votó a favor de la sugerencia REGEXP_REPLACE y el ejemplo bellamente diseñado (debería haber una bonificación especial para aquellos en SO). Pero no hace lo que pidió el OP, que es solo eliminar en comienzo y final de una cadena de varias líneas. Me voy a tomar la libertad de editar para ajustar la expresión regular en consecuencia. - andres spencer

Por cierto, al probar, es mucho más fácil ver lo que está sucediendo si configura el tercer parámetro en regexp_replace a una '.' en lugar de null - andres spencer

Hola @Andrew, gracias por el voto a favor. Sin embargo, tendré que revertir sus cambios ya que su nueva versión ahora significa que el ejemplo no produce el resultado indicado. El objetivo del ejemplo era demostrar la amplitud del espacio en blanco que manejaba el [[:space:]] y [[:ctrl:]] parámetros. Quizás le gustaría actualizar la respuesta para incluir sus expresiones modificadas al final de la respuesta después de mi ejemplo simplificado. Además, no esté de acuerdo con el uso de '.' en lugar de null - el null deja en claro que estás reemplazando con nada. - Nick Pierpoint

Este corte del último carácter alfa en mi prueba - Superhéroe

Así es como lo implementaría:

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

contestado el 07 de mayo de 14 a las 11:05

¡No estoy seguro de por qué esto no ha recibido más atención! Es la única respuesta correcta en la página. Y conciso también. - carro de caballos

Esta es la mejor respuesta - cagri

Correcto pero impactante en el rendimiento. Me pregunto por qué Oracle no permite funciones tan pequeñas sin expresiones regulares. - khalidmehmoodawan

Advertencia: la clase de caracteres [: space:] de Oracle no parece coincidir con el espacio que no se rompe. - jon heggland

Puede utilizar 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 por la cadena combinada.

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

Respondido 16 Feb 10, 00:02

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

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

Respondido el 31 de enero de 17 a las 13:01

¿Para qué versión de Oracle? 10g + admite expresiones regulares - ver tsu hilo en el foro de discusión de OTN sobre cómo usar REGEXP_REPLACE para cambiar caracteres no imprimibles en ''.

Respondido 15 Feb 10, 21:02

Página no encontrada ... Es por eso que "vincular solo respuestas" es malo - Marek

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 espacios or caracteres ctrl al comienzo de la cadena
  2. No espacios or caracteres ctrl al final de la cuerda
  3. Múltiples ocurrencias de espacios or caracteres ctrl será reemplazado por un solo espacio

El siguiente código 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:]]{2,}|[[:cntrl:]])', ' ')) fixed
  FROM test_view;


ORIGINAL               FIXED                 
---------------------- ----------------------
    Q   qwer           Q qwer qwerqwer qwerty

 qwerqwer     qwerty                                         

1 row selected.

Respondido 30 Abr '19, 13:04

Si alguien está buscando convertir datos en 1 variable que se encuentra en 2 o 3 líneas diferentes como a continuación

'Data1

Data2'

Y desea mostrar los datos como 'Data1 Data2' y luego usar a continuación

select TRANSLATE ('Data1

Data2', ''||CHR(10), ' ') from dual;

me tomó horas obtener el resultado correcto. Gracias a mí te acabo de ahorrar 1 o 2 horas :)

Respondido 20 Feb 20, 18:02

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 (conversión de fecha a milisegundos, por ejemplo) donde encontrará útil el respaldo de Java.

Respondido 16 Feb 10, 16:02

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),'')

Respondido 04 Feb 15, 12:02

No funciona. Puede haber chr(13) or chr(10) en el medio de la cadena como se publicó originalmente en la pregunta. - carro de caballos

Pruebe el siguiente código. Funcionará si ingresa 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

Respondido el 08 de enero de 16 a las 02:01

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

Respondido 06 Oct 16, 08:10

Es bueno dar algo de código, pero debería venir con alguna explicación para señalar los cambios y por qué es la solución a la pregunta del OP. - рüффп

Si bien este fragmento de código puede resolver la pregunta, incluyendo una explicación realmente ayuda a mejorar la calidad de tu publicación. Recuerde que está respondiendo a la pregunta para los lectores en el futuro, y es posible que esas personas no conozcan los motivos de su sugerencia de código. - J. Chomel

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;

Respondido el 07 de Septiembre de 18 a las 12:09

El código de Fowloing elimina la nueva línea de ambos lados de la cadena:

select ltrim(rtrim('asbda'||CHR(10)||CHR(13) ,''||CHR(10)||CHR(13)),''||CHR(10)||CHR(13))  from dual

pero en la mayoría de los casos, este es suficiente:

select rtrim('asbda'||CHR(10)||CHR(13) ,''||CHR(10)||CHR(13)))  from dual

respondido 04 nov., 20:08

UPDATE My_Table
   SET Mycolumn1 =
           TRIM (
               TRANSLATE (Mycolumn1,
                          CHR (10) || CHR (11) || CHR (13),
                          '    '))
 WHERE (   INSTR (Mucolumn1, CHR (13)) > 0
        OR INSTR (Mucolumn1, CHR (10)) > 0
        OR INSTR (Mucolumn1, CHR (11)) > 0);

Respondido 01 Abr '21, 06:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.