Обрезать пробелы (строка новой строки и табуляции) в строке в Oracle - PullRequest
32 голосов
/ 16 февраля 2010

Мне нужно обрезать новую строку (Chr (13) и Chr (10) и табуляцию из начала и конца строки) в запросе Oracle. Я узнал, что в Oracle нет простого способа обрезать несколько символов. Функция «Trim» обрезает только один символ. Было бы снижение производительности, если бы я вызывал функцию рекурсии в цикле, используя функцию. Я слышал, что regexp_replace может сопоставлять пробелы и удалять их. Можете ли вы рассказать о надежном способе использования regexp_replace для обрезки нескольких пространств табуляции или новых строк или их комбинаций в начале и конце строки. Если есть другой способ, пожалуйста, направьте меня.

Ответы [ 12 ]

32 голосов
/ 16 февраля 2010

Если у вас Oracle 10g, REGEXP_REPLACE довольно гибкий.

Использование следующей строки в качестве теста:

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

[[:space:]] удалит все пробелы, а регулярное выражение ([[:cntrl:]])|(^\t) удалит непечатные символы и вкладки.

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
    )

Возвращение

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

Надеюсь, это пригодится.

18 голосов
/ 07 мая 2014

Вот как бы я это реализовал:

     REGEXP_REPLACE(text,'(^[[:space:]]*|[[:space:]]*$)')
14 голосов
/ 16 февраля 2010

Как насчет быстрого и грязного перевода?

Это удалит все вхождения каждого символа в строке1:

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

Regexp_replace является опцией, но вы можете увидеть снижение производительности в зависимости от сложности вашего выражения.

9 голосов
/ 16 февраля 2010

Вы можете использовать как LTRIM, так и RTRIM.

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

Если вы хотите урезать CHR (13) только тогда, когда он идет с CHR (10), это усложняется. Во-первых, переводится объединенная строка в один символ. Затем LTRIM / RTRIM этот символ, а затем заменить один символ обратно в объединенную строку.

select replace(rtrim(ltrim(replace('abccccabcccaab','ab','#'),'#'),'#'),'#','ab') from dual;
4 голосов
/ 31 января 2017
TRANSLATE (column_name, 'd'||CHR(10)||CHR(13), 'd')

'd' - фиктивный символ, потому что перевод не работает, если 3-й параметр равен нулю.

3 голосов
/ 16 февраля 2010

Для какой версии Oracle? 10g + поддерживает регулярные выражения - см. Его ветку t на дискуссионном форуме OTN о том, как использовать REGEXP_REPLACE для преобразования непечатных символов в ''.

1 голос
/ 30 июня 2016

Я знаю, что это не строгий ответ на этот вопрос, но я работал в нескольких сценариях, где вам нужно преобразовать текстовые данные, следуя этим правилам:

  1. Нет пробелы или ctrl-символы в начале строки
  2. Нет пробелы или символы ctrl в конце строки
  3. Несколько вхождений пробелов или символов ctrl будут заменены на один пробел

Код ниже следует правилам, описанным выше:

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.
0 голосов
/ 07 сентября 2018

Вместо использования regexp_replace несколько раз используйте (\s), как указано ниже;

SELECT regexp_replace('TEXT','(\s)','')
FROM dual;
0 голосов
/ 06 октября 2016
TRIM(BOTH chr(13)||chr(10)||' ' FROM str)
0 голосов
/ 08 января 2016

Попробуйте код ниже. Это будет работать, если вы введете несколько строк в одном столбце.

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; 

Вывод: тест первый тест, второй тест третий

...