2017-02-16 8 views
0

私はこの質問に苦労してこのフォーラムにある解決策を試していますが、私は続行できません。私は助けが必要です。 私は、船の寿命を超えて船名を格納する列を持っています。私はそれらを3つの列に分割したいと思います。 主に私はこれらの3つのオプション、PostgreSQLサブストリングのスペースが空白

a)に一つだけの名前

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)3つの名前を持っている:私は最初

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 '%, %'; 
を得ることができます

2番目以外

レコードは次のようになり名付け

3:空白を見つけて、2番目の名前を取得するには#「パターン#」にはいくつかの変更により

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

:私は、このオプションを試してみました

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

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

ないすべてのレコードは、ので、いくつかは、{「サント」、「ドミンゴ」}が、他のではない好き{「ロザリオ」のように解決されているのと同じ長さを持っているので、しかし、それは動作しません: は、それから私は、このオプションを試してみました、 "、"} 私はregex sintaxに慣れていません。この例はPostgreSQLのドキュメントにあります。何かヒント?

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

\s:空白文字、+彼らはコンマプラスオプションの空白または次の正規表現がうまくいく必須空白に囲まYで分離されるたびに名前を分割すべき

+0

が ' '[\\よ、] +'' Eを試してみてください空白とコンマの両方。 –

+2

正確に何をしたいですか? 「NuestraSeñoradel Rosario、Santo Domingo y SanJosé」が入力された場合、「NuestraSeñoradel Rosario」、「Santo Domingo」、「SanJosé」を出力しますか?はいの場合は、3つの別々の列を持つ1つの行、または1つの列を持つ3つの行? a)とb)のソリューションを例として提供できますか? –

+0

@ markus-benko私が使用したレコードの部分文字列にコードを追加しました。それは正常に働いた。フィードバックありがとう –

答えて

0

:少なくとも1つ、*:0以上および|は交替を意味します。

この正規表現利用例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からそのまま実行すると、期待どおりの出力が得られませんか?代わりに何を得ますか?正規表現はs文字を消去しません。多分、コピーアンドペーストや誤解に問題がありますか? –

+0

'Id |船名1 |船名2 |船名31 | NuestraSeñoradel Rosario |サントドミンゴ・イ・サン・ホセ| "" 2 | NuestraSeñoradel Rosario y Santo Domingo | "" | "" 3 | NuestraSeñoradel Rosario | "" | ""これは私の反応です。私はこのサーバでPostgres 8.3を使用していますが、これは問題になるかもしれませんか? –

関連する問題