Пробелы для обрезки (Новая строка и пространство Вкладки) в Строке в Oracle

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

33
задан OMG Ponies 15 February 2010 в 21:32
поделиться

5 ответов

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

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

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

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

14
ответ дан 27 November 2019 в 17:44
поделиться

Вы можете использовать как 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;
9
ответ дан 27 November 2019 в 17:44
поделиться

Если у вас 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 »

Использование Qqwerqwerqwer qwerty »

.

33
ответ дан 27 November 2019 в 17:44
поделиться

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

0
ответ дан 27 November 2019 в 17:44
поделиться

Вы не упомянули ограничения платформы Windows, но если вам не нужна совместимость со старыми версиями, чем Windows Server 2003 или Vista на стороне клиента, вы можете использовать функцию InterlockedExchange64 () для обмена 64-разрядными значениями. Упаковав два 32-разрядных указателя в 64-разрядную парную структуру, можно эффективно поменять местами два указателя.

В этом случае существуют обычные вариации Блокированный *; InterlockedExchangeAcquire64 (), InterlockedCompareExchange64 () и т.д.

Если вам нужно запустить, скажем, XP, я бы пошел на критический раздел. Когда вероятность раздора невысока, они выступают достаточно хорошо.

-121--4244562-

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

-121--1886467-

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

3
ответ дан 27 November 2019 в 17:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: