我需要在Oracle查询中修剪New Line(Chr(13)和Chr(10)以及String的开头和结尾的Tab空间)。我了解到在Oracle中修剪多个字符没有简单的方法。 “trim”功能仅修剪单个字符。如果我使用函数在循环中递归调用trim函数,那将会降低性能。我听说regexp_replace可以匹配空格并删除它们。 您是否可以指导使用regexp_replace在String的开头和结尾修剪多个制表空间或新行或它们的组合的可靠方法。如果还有其他方式,请指导我。
答案 0 :(得分:32)
如果你有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
)
返回:
Qqwerqwerqwerqwerty
”Q qwerqwerqwer qwerty
”希望这有一些用处。
答案 1 :(得分:18)
我将如何实现它:
REGEXP_REPLACE(text,'(^[[:space:]]*|[[:space:]]*$)')
答案 2 :(得分:14)
快速和脏的翻译功能怎么样?
这将删除string1中每个字符的所有匹配项:
SELECT translate(
translate(
translate(string1, CHR(10), '')
, CHR(13), '')
, CHR(09), '') as massaged
FROM BLAH;
Regexp_replace是一个选项,但您可能会看到性能受到影响,具体取决于您的表达式的复杂程度。
答案 3 :(得分:9)
您可以同时使用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 :(得分:4)
TRANSLATE (column_name, 'd'||CHR(10)||CHR(13), 'd')
'd'是一个虚拟字符,因为如果第3个参数为null,则translate不起作用。
答案 5 :(得分:3)
对于什么版本的Oracle? 10g +支持正则表达式 - 请参阅t his thread on the OTN Discussion forum for how to use REGEXP_REPLACE将不可打印的字符更改为''
。
答案 6 :(得分:1)
我知道这不是这个问题的严格答案,但我已经在几个需要根据这些规则转换文本数据的场景中工作:
以下代码遵循上述规则:
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.
答案 7 :(得分:1)
如果所有人都希望将数据转换为位于下面2或3行中的1个变量中的数据
'Data1
Data2'
您想将数据显示为“ Data1 Data2”,然后在下面使用
select TRANSLATE ('Data1
Data2', ''||CHR(10), ' ') from dual;
我花了几个小时才能得到正确的输出。多亏了我,我才为您节省了1或2个小时:)
答案 8 :(得分:0)
如果Oracle解决方案看起来过于复杂,我使用静态方法创建一个java类,然后将其作为一个包安装在Oracle中。这可能不是那么高效,但您最终会发现其他情况(例如,日期转换为毫秒),您会发现java后备有用。
答案 9 :(得分:0)
下面的代码可用于删除文本列中的新行和表空间
Select replace(replace(TEXT,char(10),''),char(13),'')
答案 10 :(得分:0)
尝试以下代码。 如果您在一列中输入多行,它将起作用。
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 :(得分:0)
TRIM(BOTH chr(13)||chr(10)||' ' FROM str)
答案 12 :(得分:0)
代替多次使用regexp_replace
,而使用(\s)
,如下所示;
SELECT regexp_replace('TEXT','(\s)','')
FROM dual;
答案 13 :(得分:0)
下面的代码从字符串的两侧删除换行符:
select ltrim(rtrim('asbda'||CHR(10)||CHR(13) ,''||CHR(10)||CHR(13)),''||CHR(10)||CHR(13)) from dual
但是在大多数情况下,这只是足够了:
select rtrim('asbda'||CHR(10)||CHR(13) ,''||CHR(10)||CHR(13))) from dual
答案 14 :(得分:0)
UPDATE My_Table
SET Mycolumn1 =
TRIM (
TRANSLATE (Mycolumn1,
CHR (10) || CHR (11) || CHR (13),
' '))
WHERE ( INSTR (Mucolumn1, CHR (13)) > 0
OR INSTR (Mucolumn1, CHR (10)) > 0
OR INSTR (Mucolumn1, CHR (11)) > 0);