2016-09-20 28 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請參閱編輯以獲得更簡單的解決方案。 –