2016-09-20 38 views
0

所以,我有像一块简单的SQL:REGEXP_SUBSTR不能按预期工作

select 
REGEXP_SUBSTR (randomcol, '[^|]+', 1, 2) 
||'|'||  REGEXP_SUBSTR (randomcol, '[^|]+', 1, 3) 
||'|'||  REGEXP_SUBSTR (randomcol, '[^|]+', 1, 4) 
from table1 where ADDTL_DETAIL_INFO is not null and module_key='01-07-2016 00:00:00/2212/ 1'; 

的想法是让存在于randomcol列管分离值,其中存在的价值是:

~custom|HELLO1||HELLO3 

所以我需要像HELLO1这样的值,空格(因为第二个管道和第三个管道之间没有数值)和HELLO3。

但是,当我跑上面的查询它返回:

HELLO1|HELLO3| 

和白色的空间也没有了。我需要这个空白空间来保留。那么我在这里做错了什么?

+0

你没有做错什么,Oracle是 - 通过将空字符串视为null。在遥远的未来,甲骨文将会倒闭,或者他们会解决这个问题(以先到者为准)。 – mathguy

回答

1

表格'[^|]+'的正则表达式不适用于NULL列表元素,应该避免!看到这个职位的详细信息:Split comma separated values to columns in Oracle

改用此表单:

select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual; 

这可以理解为“获得第一个记忆组设定用逗号或结束字符的第五届发生队伍的尽头”。

因此,对于第四个元素,您可以使用它来保留元素3中的NULL(假设您想要通过单独的元素构建它,而不是从第一个分隔符到末尾的字符处获取字符串):

... 
REGEXP_SUBSTR (addtl_detail_info, '(.*?)(\||$)', 1, 2) || 
REGEXP_SUBSTR (addtl_detail_info, '(.*?)(\||$)', 1, 3) || 
REGEXP_SUBSTR (addtl_detail_info, '(.*?)(\||$)', 1, 4) 
... 

你知道,这可能会更容易。第一管后,只要抓住一切:

SQL> select REGEXP_replace('~custom|HELLO1||HELLO3', '^.*?\|(.*)', '\1') result 
    from dual; 

RESULT 
-------------- 
HELLO1||HELLO3 

SQL> 

括号环绕要“记住”和替换字符串引用与“\ 1”记忆组的第一个东西。

+0

非常感谢。我不知道这种用法。也感谢提供的链接。 – Mistu4u

+0

你敢打赌,我一直在做一个人的使命,让人们意识到这个问题[^ |] +'!这是一个完美的例子。 –

+1

@ Mistu4u请参阅编辑以获得更简单的解决方案。 –