2017-02-16 23 views
0

我一直在嘗試使用此查詢嘗試在此論壇中找到解決方案,但我無法繼續。我需要幫助。 我有一個存儲通過船舶生命的船名的專欄,我想將它們分成三欄。 主要是我有這三個選項,PostgreSQL使用空格的子串模式

一)只有一個名字

select t2.esp1,t2.espectro,t2.espectro1, t2.id from(
select substring(t.espectro, t.posfin)::varchar as esp1, t.espectro,t.espectro1,t.id from(
select "Id" as id, strpos(shipname, ', ') as posinic, strpos(shipname, ' y ') as posfin,shipname as espectro, shipname1 as espectro1 from ships) t)t2 (esp1, espectro, espectro1, id) 
where t2.esp1 not like '% y %'`) 

B)兩個名字

select t2.esp1,t2.espectro,t2.espectro1, t2.id from(
select substring(t.espectro,1, t.posfin)::varchar as esp1, t.espectro,t.espectro1,t.id from(
select "Id" as id, strpos(shipname, ', ') as posinic, strpos(shipname ' y ') as posfin,shipname as espectro, shipname1 as espectro1 from ships) t)t2 (esp1, espectro, espectro1, id) 
where t2.esp1 not like '%, %'`) and for the second name (`select t2.esp1,t2.espectro,t2.espectro1, t2.id from(
select substring(t.espectro, t.posfin)::varchar as esp2, t.espectro,t.espectro2,t.id from(
select "Id" as id, strpos(shipname, ', ') as posinic, strpos(shipname, ' y ') as posfin,shipname as espectro, shipname2 as espectro2 from ships) t)t2 (esp2, espectro, espectro2, id) 
where t2.esp2 like '% y %' and t2.espectro not like '%, %'; 

和c)三個名字:我能拿第一

select substring(t.espectro,1,t.posicion) from(
select strpos(shipname, ',') as posicion,shipname as espectro from ships) t;` and third `select t2.esp3,t2.espectro,t2.espectro3, t2.id from(
select substring(t.espectro, t.posfin)::varchar as esp3, t.espectro,t.espectro3,t.id from(
select "Id" as id, strpos(shipname, ', ') as posinic, strpos(shipname, ' y ') as posfin,shipname as espectro, shipname3 as espectro3 from ships) t)t2 (esp3, espectro, espectro3, id) 
where t2.esp3 like '% y %' and t2.espectro like '%, %'; 

但不是第二個

三個已命名的記錄是這樣的:

Nuestra Señora del Rosario, Santo Domingo y San José 

我已經試過此選項:

select substring(t.shipsnames from '%#",_y#"%' for '#') as name2 from ships t 

隨着在#一些變化「模式#」找到空格和獲得的第二個名字。 然後我試圖此選項:

select t2.name2[6:7] from (regexp_split_to_array(t.shipnames, E'\\s+') as name2 from ships t) t2 

,但它不工作,因爲不是每個記錄都有相同的長度,所以有的都解決了像{「城主」,「多明戈」},但其他不喜歡{「羅薩里奧」 「」}。 我不熟悉正則表達式sintax,我在PostgreSQL文檔中找到了這個例子。任何提示?

+0

嘗試'E '[\\ S,] +''如果您需要與分割空格和逗號。 –

+2

你想要達到什麼目的?當「NuestraSeñoradel Rosario,Santo Domingo y SanJosé」作爲輸入提供時,是否需要'NuestraSeñoradel Rosario','Santo Domingo'和'SanJosé'作爲輸出?如果是,一行有三個獨立的列或三行有一列?你能否提供你的解決方案a)和b)作爲例子? –

+0

@ markus-benko我添加了代碼來對我使用的記錄進行子串處理。它運行良好。感謝您的反饋 –

回答

0

當每當它們被逗號分隔加上可選的空白或用ý通過強制性的空白包圍的以下正則表達式將工作名稱應拆分:

\s*,\s*|\s+y\s+ 

\s:空白字符,+ :至少一個,*:零個或多個,|表示交替。

例SQL利用該正則表達式:

SELECT Id, ShipNamesArray[1] ShipName1, ShipNamesArray[2] ShipName2, ShipNamesArray[3] ShipName3 
FROM (
    SELECT Id, regexp_split_to_array(Shipnames, '\s*,\s*|\s+y\s+') ShipNamesArray 
    FROM (VALUES 
     (1, 'Nuestra Señora del Rosario, Santo Domingo y San José'), 
     (2, 'Nuestra Señora del Rosario y Santo Domingo'), 
     (3, 'Nuestra Señora del Rosario') 
    ) AS ExampleShipNames (Id, ShipNames) 
) AS SplitShipNames 

的SQL會產生這樣的輸出:

Id | ShipName1     | ShipName2  | ShipName3 
-- | -------------------------- | ------------- | --------- 
1 | Nuestra Señora del Rosario | Santo Domingo | San José 
2 | Nuestra Señora del Rosario | Santo Domingo | 
3 | Nuestra Señora del Rosario |    | 
+0

嗨!感謝您的反饋。我試過你的解決方案,至少對我來說它失敗了。它不會在'\ s + y \ s +'和's'字符之間分割名字。我已經將代碼改進爲這個'',\ s * | \ s * y \ s *''。但是現在我有一個新問題。有些名字像'Nuestraseñorade los Reyes'或'San Cayetano',並且這些名字被拆分,因爲代碼並不完美。我嘗試了幾個選項,比如'\,\ s + | \ s * y \ s +'和其他組合。但它仍然不起作用如果沒有其他解決方案,你的是偉大的,只需要一點清潔工作,所以提前致謝! –

+0

當您按原樣從答案1:1執行SQL時,您是否獲得預期的輸出?你會得到什麼?正則表達式不會擦除s字符。也許有複製和粘貼或誤解的問題? –

+0

'ID |船名1 |船名2 |船名31 | NuestraSeñoradel Rosario | Santo Domingo y SanJosé|「」 2 | NuestraSeñoradel Rosario y Santo Domingo |「」|「」 3 | NuestraSeñoradel Rosario |「」|「」'這是我得到的迴應。我在這臺服務器上使用Postgres 8.3,這可能是個問題嗎? –