Подтвердить что ты не робот

Trim Whitespaces (новое пространство строк и таблиц) в строке в Oracle

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Если у вас есть 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) regexp удалит непечатаемые символы и вкладки.

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"

Надеюсь, это будет полезно.

Ответ 3

Вот как я его реализую:

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

Ответ 4

Вы можете использовать как 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;

Ответ 5

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

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

Ответ 7

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

  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.

Ответ 8

В случаях, когда решение Oracle кажется чрезмерно запутанным, я создаю класс java со статическими методами, а затем устанавливаю его как пакет в Oracle. Это может быть не так результативно, но в конечном итоге вы найдете другие случаи (например, преобразование даты в миллисекунды), где вы найдете полезную резервную копию java.

Ответ 9

Ниже код может использоваться для удаления новой строки и табличного пространства в текстовом столбце

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

Ответ 10

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

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; 

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

Ответ 11

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

Ответ 12

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

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