2016-07-10 52 views
0

我在將「真實世界」數據傳輸到我的模式時遇到了問題。 這實際上是我的數據庫課程的一個「項目」,他們給我們的表格與狗比賽結果。這個表格有一列,其中包含狗的名稱(它本身包括實際名稱和育種者的名字)以及關於出生國家,實際生活國家和出生年份的信息。 舉例爲「Lillycette [AU 2012]」或「Black Bear Lee [AU/AU 2013]」或「Lemon Ralph [IE/UK 1998]」。 我設法它走出的第一個字,並將其保存在split_part右列是這樣的:如果存在,則選擇字符串的中間部分。 Postgresql

INSERT INTO tblHund (rufname) 
SELECT 
    split_part(name, ' ', 1) AS rufname, 
FROM tblimport; 

tblimport是我從CSV文件轉儲的數據表。 就像它應該那樣工作。 訪問與此名稱的第二部分失敗,因爲有時不存在第二部分,有時時有第二部分由兩個單詞組成。

這就是我現在堅持的地方。 我與子和正則表達式試了一下:沒有錯誤執行

INSERT INTO tblZwinger (Name) 
SELECT 
    substring(vatertier from E'[^ ]*\\ (+)$')AS Name 
FROM tblimport 
WHERE substring(vatertier from E'[^ ]*\\ (+)$') != ''; 

上面的代碼,但實際上什麼也不做,因爲SELECT語句只是給空字符串回來。

花了我3個多小時才明白了這個正則表達式,但是當我看着它們時,我仍然覺得很愚蠢。

有沒有其他的方式來做到這一點。如果是這樣,給我一個提示。 如果不是我上面的表達有什麼問題?

感謝您的幫助。

回答

0

需要使用原子.,它匹配捕獲組內的任何單個字符:

E'[^ ]*\\ (.+)$' 
0
SELECT 
    tblimport.*, 
    ti.parts[1] as f1, 
    ti.parts[2] as f2, -- It should be the "middle part" 
    ti.parts[3] as f3 
FROM 
    tblimport, 
    regexp_matches(tblimport.vatertier, '([^\s]+)\s*(.*)\s+\[(.*)\]') as ti(parts) 
WHERE 
    nullif(ti.parts[2], '') is not null 

喜歡的東西上面。

相關問題