我需要在 Oracle 查询中修剪新行(Chr(13) 和 Chr(10) 以及字符串开头和结尾的制表符空间)。我了解到在 Oracle 中没有简单的方法可以修剪多个字符。“修剪”功能仅修剪单个字符。如果我使用函数在循环中递归调用修剪函数,那将是性能下降。我听说 regexp_replace 可以匹配空格并删除它们。您能否指导一种可靠的方法来使用 regexp_replace 在字符串的开头和结尾修剪多个制表符或新行或它们的组合。如果有其他方法,请指导我。
15 回答
如果您有 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
”
希望这有点用。
这就是我将如何实现它:
REGEXP_REPLACE(text,'(^[[:space:]]*|[[:space:]]*$)')
快速而肮脏的翻译功能怎么样?
这将删除 string1 中每个字符的所有出现:
SELECT translate(
translate(
translate(string1, CHR(10), '')
, CHR(13), '')
, CHR(09), '') as massaged
FROM BLAH;
Regexp_replace 是一个选项,但根据表达式的复杂程度,您可能会看到性能下降。
您可以同时使用 LTRIM 和 RTRIM。
select rtrim(ltrim('abcdab','ab'),'ab') from dual;
如果您只想在带有 CHR(10) 的情况下修剪 CHR(13),它会变得更加复杂。首先,将组合字符串转换为单个字符。然后 LTRIM/RTRIM 该字符,然后将单个字符替换回组合字符串。
select replace(rtrim(ltrim(replace('abccccabcccaab','ab','#'),'#'),'#'),'#','ab') from dual;
TRANSLATE (column_name, 'd'||CHR(10)||CHR(13), 'd')
'd' 是一个虚拟字符,因为如果第三个参数为空,则翻译不起作用。
对于什么版本的 Oracle?10g+ 支持正则表达式 -有关如何使用 REGEXP_REPLACE将不可打印字符更改为''
.
我知道这不是这个问题的严格答案,但我一直在几个需要按照以下规则转换文本数据的场景中工作:
- 字符串开头没有空格或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.
如果有人想要转换位于 2 或 3 个不同行中的 1 个变量中的数据,如下所示
'Data1
Data2'
并且您想将数据显示为“Data1 Data2”,然后在下面使用
select TRANSLATE ('Data1
Data2', ''||CHR(10), ' ') from dual;
我花了几个小时才得到正确的输出。多亏了我,我才为您节省了 1 或 2 小时 :)
如果 Oracle 解决方案看起来过于复杂,我会使用静态方法创建一个 java 类,然后将其作为包安装在 Oracle 中。这可能没有那么高效,但您最终会发现其他情况(例如日期转换为毫秒),您会发现 java 回退很有帮助。
下面的代码可用于删除文本列中的新行和表空间
Select replace(replace(TEXT,char(10),''),char(13),'')
试试下面的代码。如果您在单列中输入多行,它将起作用。
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;
输出:测试第一测试第二测试第三
TRIM(BOTH chr(13)||chr(10)||' ' FROM str)
而不是使用下面给出的regexp_replace
多次使用;(\s)
SELECT regexp_replace('TEXT','(\s)','')
FROM dual;
以下代码从字符串的两侧删除换行符:
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
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);