O meu problema é transformar um campo que retorna a informação da forma:
"250077#;#251420#;#251000#;#250915#;#250840#;#251720#;#251320#;#251398#;#"
em um lista da forma:
"500625,500085,250760,250933,250050,250530,250210,250560,251430,251570,251100,250077,251420,251000,250915,250840,251720,251320,251398,251207,250205,251203,251365,251445,250720,250990,250940,250790,250980,250090,251270,251280,250937,250740,250230,250290,250280,250130,251580,251275,250250,250215,250435,250950,250120,250040,251510,352780,351670,350150,350140,311787,250270,251600,251590,250190,250270,251600,251590,250190,250960,250220,251450,250070,251330,251680,250960,250220,251450,250070,251330,251680,251560,250820,251593,250580,251272,251160,250520,250080,251150,250640,251500,"
Para resolver isso criei uma função em PostgreSQL para executar esta tarefa:
CREATE or REPLACE FUNCTION lista_mun() RETURNS varchar AS '
DECLARE
    mviews RECORD;
    lista varchar;
BEGIN
    lista := \'\';
    FOR mviews IN select replace(resposta,\'#;#\',\',\') as mun
         from dados.itemquest
         where pergunta=\'p_mun_ref\' LOOP
         lista := lista ||  mviews.mun;
      
    END LOOP;
    RETURN lista;
END;
' LANGUAGE plpgsql;
Forma de utilização:
      select lista_mun()
A função acima tem um problema, como comparar o texto contendo número inteiros com um número inteiro.
Assim reescrevi a função para que retornasse um vetor de inteiros:
CREATE OR REPLACE FUNCTION dados.lista_mun()
  RETURNS integer[] AS
$BODY$
DECLARE
    mviews RECORD;
    lista varchar;
    return_arr text[];
BEGIN
    lista = '';    
    FOR mviews IN select replace(resposta,'#;#',',' ) as mun
         from dados.itemquest
         where pergunta='p_mun_ref' LOOP
         lista := lista ||  mviews.mun;
      
    END LOOP;
    return_arr := '{' || lista || 0 ||  '}';
   RETURN return_arr;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
Para utilizar esta função, é necessário transformar o vetor de inteiros para número inteiros individuais:
    select *
              from
               generate_series(1,array_upper(dados.lista_mun(),1)) as idx(i), 
               dados.lista_mun() as arr(a)
Onde a função
array_upper(dados.lista_mun(),1)  = Retorna o tamanho do array
 generate_series(1,array_upper(dados.lista_mun(),1))  = Retorna número de 1 ao tamanho do array
O uso final da função ficou assim:
    select c.gid, MakePoint(c.longitudes,c.latidudese ) as the_geom
            from mapas.shp_munic c
            where c.ibge in 
            (select arr.a[idx.i]
              from
               generate_series(1,array_upper(dados.lista_mun(),1)) as idx(i), 
               dados.lista_mun() as arr(a))
Nenhum comentário:
Postar um comentário