在Oracle SQL查询中替换TAB

时间:2014-05-20 09:50:57

标签: sql regex oracle

以下是查询,我在更换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

虽然查询在标签[^,]

的步调中用于逗号

2 个答案:

答案 0 :(得分: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:]]')) 

rownum计算通过减去&#34;清除&#34;的长度来计算空白字符的数量。字符串从原始字符串的长度

答案 1 :(得分:0)

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

之间有一个标签
select REPLACE('ABC DEF GHI JKL MNO', chr(9), chr(32) ) str
  from dual
 /

STR
-------------------
ABC DEF GHI JKL MNO