Мне нужно обрезать новую строку (Chr (13) и Chr (10) и Tab в начале и в конце строки) в запросе Oracle. Я узнал, что нет простого способа обрезать несколько символов в Oracle. Функция "обрезка" выравнивает только один символ. Это будет ухудшение производительности, если я вызову функцию trim recursivelly в цикле, используя функцию. Я слышал, что regexp_replace может сопоставлять пробелы и удалять их. Можете ли вы руководствоваться надежным способом использования regexp_replace для обрезки нескольких таблиц или новых строк или их комбинаций в начале и конце строки. Если есть какой-либо другой способ, пожалуйста, направляйте меня.
Trim Whitespaces (новое пространство строк и таблиц) в строке в Oracle
Ответ 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.
Ответ 6
Для какой версии Oracle? 10g + поддерживает регулярные выражения - см. T его поток на дискуссионном форуме OTN для использования REGEXP_REPLACE для изменения непечатаемых символов в ''
.
Ответ 7
Я знаю, что это не строгий ответ на этот вопрос, но я работал в нескольких сценариях, где вам нужно преобразовать текстовые данные, следуя этим правилам:
- Без пробелов и символов Ctrl в начале строки
- Без пробелов и символов Ctrl в конце строки
- Несколько вхождений пробелов или символов 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;