替换Oracle SQL查询中的TAB



下面是查询,我面临的问题是替换TAB和显示到一个列

with test as 
(select 'ABC    DEF GHI JKL MNO' str from dual 
) 
select regexp_substr (str, '[t]+', 1, rownum) split 
  from test 
connect by level <= length (regexp_replace (str, '[t]+'))  + 1

您的查询中有几个问题:

  • 您的REGEXP_SUBSTR返回制表符而不是单词-您需要反转字符类
  • 您的行数计算是错误的:length (regexp_replace (str, '[t]+')) + 1将返回与字符串包含制表符一样多的行;使用length(str) - length(regexp_replace(...))代替

下面是一个使用[[:space:]]来匹配制表符的版本(它也将匹配空格等):

with test as 
(select 'ABC  DEH G IJKL' str from dual 
) 
select str, 
  regexp_substr (str, '[^[:space:]]+', 1, rownum) split
from test 
connect by level <= length(str) - length (regexp_replace (str, '[[:space:]]')) 

行数计算通过从原始字符串

的长度中减去"清理"字符串的长度来计算空白字符的数量。

我使用Replace() fn得到预期结果。问题是你必须确保你的字符串是由制表符分隔的,而不是其他的。首先,我复制并分隔字符串ABC和DEF…记事本中的by选项卡。然后我复制并运行SQL PLUS中的查询并获得正确的输出。在记事本中复制/粘贴下面的示例以查看正确的格式。'ABC DEF…'之间有一个制表符:

select REPLACE('ABC DEF GHI JKL MNO', chr(9), chr(32) ) str
  from dual
 /
STR
-------------------
ABC DEF GHI JKL MNO

最新更新