2017-04-21 1 views
0

J'essaye de concevoir une fonction pour résoudre ce problème. J'ai une colonne avec des villes qui ressemble à ceci.Fonction d'extraction d'éléments de tableau dans différentes colonnes postgresql

1 |Curaçao-Amsterdam 
2 |St. Christopher-Essequibo 
3 |Texel-Riohacha-Buenos Aires-La Rochelle` 

Et je l'ai utilisé cette requête pour extraire un ensemble d'éléments

select t2.rut1,t2.rutacompleta, t2.id 
from (
    select regexp_split_to_array(t.rutacompleta, E'[\-]+') as rut1, 
      t.rutacompleta,t.id 
    from (
     select id, strpos(ruta, '-') as posinic, strpos(ruta, '-') as posfin, 
     ruta as rutacompleta 
     from dyncoopnet.todosnavios2 
    ) t 
) t2 

qui donne ce résultat:

{Curaçao,Amsterdam} 
{"St. Christopher",Essequibo} 
{Texel,Riohacha,"Buenos Aires","La Rochelle"}` 

Et je veux créer un fonction pour extraire * éléments de tableau à des colonnes différentes. Je l'ai pensé à une fonction tout comme ceci:

create or replace function extractpuertos() 
returns text as 
$body$ 
declare 
i integer; 
puerto text; 
begin 
i := 1 
while (i >=1) 
loop 
with tv as(
select t2.rut1,t2.rutacompleta, t2.id from(
select regexp_split_to_array(t.rutacompleta, E'[\-]+') as rut1, 
t.rutacompleta,t.id from(
select id, strpos(ruta, '-') as posinic, strpos(ruta, '-') as posfin,ruta as 
rutacompleta from dyncoopnet.todosnavios2) t)t2 
) 
select tv.rut1[i] as puerto from tv; 
end loop; 
return puerto; 
end; 

Mais je ne suis pas sûr que c'est une bonne solution, et la façon de le mettre en œuvre. Un indice? Merci d'avance!

+0

"extra ct * éléments de tableau à différentes colonnes "? .. voulez-vous dire un nombre dynamique de colonne? .. –

+0

pourquoi pas' string_to_array (rutacompleta, '-') '? .. –

Répondre

0

c'est ce que vous essayez de faire?

create table:

t=# create table so65 (i int, t text); 
CREATE TABLE 
Time: 55.234 ms 

Populate données:

t=# copy so65 from stdin delimiter '|'; 
Enter data to be copied followed by a newline. 
End with a backslash and a period on a line by itself. 
>> 1 |Curaçao-Amsterdam 
2 |St. Christopher-Essequibo 
3 |Texel-Riohacha-Buenos Aires-La Rochelle>> >> 
>> \. 
COPY 3 
Time: 2856.465 ms 

fendu:

t=# select string_to_array(t,'-') from so65; 
       string_to_array 
----------------------------------------------- 
{Curaçao,Amsterdam} 
{"St. Christopher",Essequibo} 
{Texel,Riohacha,"Buenos Aires","La Rochelle"} 
(3 rows) 

Time: 4.428 ms 

à une colonne:

t=# select unnest(string_to_array(t,'-')) from so65; 
    unnest 
----------------- 
Curaçao 
Amsterdam 
St. Christopher 
Essequibo 
Texel 
Riohacha 
Buenos Aires 
La Rochelle 
(8 rows) 

Time: 1.662 ms 
+0

Merci pour les commentaires. Ouais, j'ai finalement pensé qu'il serait préférable de faire cette solution et de garder le numéro d'identification de chaque sous-ensemble de villes. –