2010-02-15 13 views
25

Necesito recortar New Line (Chr (13) y Chr (10) y 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 múltiples caracteres en Oracle. La función "recorte" 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 coincidir con los espacios en blanco y eliminarlos. ¿Puede guiar de manera confiable el uso de regexp_replace para recortar múltiples espacios de tabulación o nuevas líneas o combinaciones de ellos al principio y al final de una cadena? Si hay alguna otra forma, por favor guíame.Trim Whitespaces (Nueva línea y espacio de tabulación) en una cadena en Oracle

+0

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

+1

Hola Seshan. ¿Alguna de las siguientes respuestas fue útil? –

+0

Voy a verificar eso. Comprobará y le hará saber .. – Seshan

Respuesta

12

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

Esto eliminará todas las ocurrencias de cada carácter en cadena1:

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

REGEXP_REPLACE es una opción, pero puede ver un impacto en el rendimiento en función de la complejidad de su expresión es.

+5

Esto está mal en dos niveles. En primer lugar, siempre que pase nulo (por ejemplo, '''') como el 3er parámetro a TRANSLATE, siempre devolverá null. En segundo lugar, TRANSLATE actúa en toda la cadena, no solo en el comienzo y el final de una cadena (como lo solicita OP). Consulte: http://docs.oracle.com/cd/E11882_01/server.112/e10592/functions216.htm#SQLRF06145 –

+2

Jeffrey está muy en lo cierto al decir que esto está roto, a menos que reemplace '' con '' (espacio en blanco). Además, translate permite especificar múltiples caracteres para ser reemplazados a la vez. Esto hace lo mismo: selecciona recortar (translate ('example', chr (10) || chr (13) || chr (09), '')) como ejemplo de dual; Tenga en cuenta que todavía reemplaza estos caracteres, en todas partes, en la cadena. – Wouter

+0

Hmm, los comentarios de stackoverflow reemplazan espacios consecutivos con solo uno. Debería haber tres espacios entre el '' en la instrucción SQL anterior. – Wouter

9

Puede usar tanto LTRIM como RTRIM.

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

Si desea recortar CHR (13) sólo cuando se trata 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 personaje, luego reemplace el carácter individual de nuevo a la cadena combinada.

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

En los casos en que la solución de Oracle parece demasiado complicado, puedo crear una clase Java con métodos estáticos y luego instalarlo como un paquete de Oracle. Puede que esto no sea tan efectivo, pero eventualmente encontrará otros casos (por ejemplo, conversión de fecha a milisegundos) donde encontrará que la alternativa de java es útil.

25

Si tiene Oracle 10g, REGEXP_REPLACE es bastante flexible.

Usando la siguiente cadena como una 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) de expresión regular eliminar los caracteres no imprimibles y las pestañas.

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 
    ) 

de Regreso:

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

Esperamos que este sea de alguna utilidad.

+0

Upvoted para sugerencia de REGEXP_REPLACE y el ejemplo bellamente presentado (debe haber una bonificación especial para aquellos en SO). Pero no hace lo que pidió OP, que es solo eliminar al inicio * y * fin * de una cadena de varias líneas. Voy a tomarme la libertad de editar para ajustar la expresión regular en consecuencia. –

+0

BTW al probar, es mucho más fácil ver lo que sucede si configuras el 3er parámetro en 'regexp_replace' en' '.'' en lugar de' null' –

+0

Hola @Andrew: gracias por el voto popular. Sin embargo, tendré que deshacer los cambios ya que su nueva versión ahora significa que el ejemplo no produce el resultado indicado. El objetivo del ejemplo fue demostrar la amplitud del espacio en blanco que manejaban los parámetros '[[: espacio:]]' y '[[: ctrl:]]'. Tal vez desee actualizar la respuesta para incluir sus expresiones modificadas al final de la respuesta después de mi ejemplo simplificado. Además, no estoy de acuerdo con el uso de '.' en lugar de 'null' - el' null' deja en claro que no reemplazas nada. –

12

Esto cómo iba a ponerlo en práctica:

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

¡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 – cartbeforehorse

+0

esta es la mejor respuesta – cagri

0

A continuación código se puede utilizar para quitar la nueva línea y el espacio en la columna de la tabla de texto

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

No funciona. Puede haber 'chr (13)' o 'chr (10)' en el medio de la cadena como se publicó originalmente en la pregunta. – cartbeforehorse

0

Pruebe el código de abajo. 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; 

de salida: Prueba segunda prueba primera prueba tercer

0

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

  1. No espacios o chars ctrl al comienzo de la strin g
  2. No hay espacios o CHARS ctrl al final de la cadena
  3. Múltiples ocurrencies de espacios o CHARS ctrl serán reemplazados a un solo espacio

código de abajo siguen 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. 
0
TRIM(BOTH chr(13)||chr(10)||' ' FROM str) 
+0

Es bueno dar algún código, pero debe venir con alguna explicación para señalar los cambios y por qué es la solución de la pregunta del OP. –

+0

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. –

+0

No resuelve el problema. Causas 'ORA-30001' – cartbeforehorse

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

La 'd' es un personaje ficticio, ya que traducir no funciona si el tercero parámetro es nulo.

Cuestiones relacionadas