2016-04-23 22 views
1

我在DB中有一個表格。 http://sqlfiddle.com/#!15/48214/1 我需要將轉儲列分成2個用戶ID和活動編號。 我一直在做這個使用如下代碼:使用regexp_split_to_array將文本列拆分爲2

select 
substring (dump, ((position('u' in dump))+1),(length(dump)-14)) as user_id, 
substring (dump, ((position('p' in dump))+3),1)) as campaign_n from "User_source"; 

但我需要在一個代碼行使用正則表達式的方法來做到這一點。已經研究了這個頁面http://www.postgresql.org/docs/9.1/static/functions-matching.html#FUNCTIONS-POSIX-REGEXP,但是我對如何正確使用所有這些原子和量詞來完成這個特定的任務有點困惑。將感謝任何形式的幫助和解釋。

+0

哪裏是正則表達式的代碼,你試過? –

回答

1

由於您已經擁有行中的所有東西,因此不需要使用regexp_split_to_array。你可以做這樣的:

select regexp_replace("dump", '.+_u([0-9]+).+', '\1') user_id, 
     regexp_replace("dump", '.+_cpn_([0-9]+)(.+)?', '\1') cpn 
from "User_source"; 

意義

  1. '.+_u([0-9]+).+'任何東西,直到_u,然後_u,任何數量的一個或多個次,以後任何事情。 '任何數字一次或多次'是分組的,所以我可以將它留在替換\1
  2. '.+_cpn_([0-9]+)(.+)?'任何東西,直到_cpn_,任何數字一次或多次,如果存在任何數字。在「任何數量的一個或多次」被分組,所以我可以離開它的替代\1

看到它在這裏工作:http://sqlfiddle.com/#!15/48214/7

+0

謝謝Jorge。是的,它的工作原理。 我可以在regexp_split_to_array中使用兩個或多個模式嗎?或者只有一個。我已經給你加了一個+,但是我沒有贏得這15個聲望點,所以沒人看到它 –

+0

AFAIK你只能在每個正則表達式函數上使用一種模式。雖然你可以制定一個模式來做不止一件事,這取決於它當然會是什麼。如果它起作用並且它是適當的答案,您只能因爲您的聲譽而接受它。如果這不是答案,請描述你的問題爲什麼你需要特別使用regexp_split_to_array。我會更新我的答案。 –

+0

我已經提到了問題,我需要只有一行代碼,但你的答案是正確的。我是thiknig,我可以通過使用這樣的東西來實現這個目標: 從(從User_source中選擇regexp_split_to_array(dump,'........'))選擇一個[1],a [2]作爲dt (一個); –