Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Dúvida PostgreSQL - Insert/Select com Vetor

Boa tarde,

Acho que o meu tópico anterior ficou bastante bagunçado por culpa minha e estou criando esse novo.

Tenho uma tabela com os seguintes campos:

vetor / tipo smallint[], nome / tipo character varying, id_usuario / tipo integer

Problema: Preciso conseguir montar uma query onde eu consiga pegar o valor do campo id_usuario e inserir no campo de vetor.

  • Tentativa:
insert into teste (vetor)
    select id_usuario from teste where nome='rafael'

Erro: ERROR: column "vetor" is of type smallint[] but expression is of type integer

Dica do Console: HINT: You will need to rewrite or cast the expression.

8 respostas

Olá Rafael, tudo bem?

No tópico anterior que você havia aberto, o Fernando sugeriu uma forma de resolver o seu problema, poderia verificar o que ele sugeriu e depois falar pra gente se funcionou?!

Aguardo o seu retorno!

Vou estar testando amanhã de manhã

Então, criei uma nova tabela de teste, agora com o campo vetor no tipo integer[] e mesmo assim não funciona a inserção.

Acredito que seja necessária uma conversão do tipo integer para integer[]. Problema é, como fazer isso?

Abaixo as 5 tabelas de teste que criei junto com a relação dos campos de vetor/coluna que preciso inserir no vetor

select * from teste
smallint[]/integer

select * from teste2
smallint[]/smallint[]

select * from teste3
smallint[]/smallint

select * from teste4
integer[]/integer

select * from teste5
integer[]/integer[]

Todas dando o mesmo erro na query:

insert into teste5 (vetor)
    select id_usuario from teste where nome='rafael'

Erro:

ERROR:  column "vetor" is of type integer[] but expression is of type integer
LINE 3:  select id_usuario from teste where nome='rafael'
                ^
HINT:  You will need to rewrite or cast the expression.

Obs: Esse erro relatado agora é referentee a tentativa na tabela teste5 cujos os tipos sao integer[] e integer[]

Bom Rafael, o tipo integer[] é um tipo array e é por esse motivo que o erro ocorre, na sua tabela teste o campo vetor foi declarado como integer, e na sua tabela teste5 o campo vetor foi declarado como integer[], como os tipos são diferentes, não é possível realizar a inserção.

Fiz o seguinte teste Rafael, criei duas tabelas com o tipo integer[]:

CREATE TABLE teste2
(
vetor integer[],
nome text
);

CREATE TABLE teste3
(
vetor integer[],
nome text 
);
  • Em seguida inseri dados apenas na tabela 2:
insert into teste2 (vetor, nome)values('{1}', 'dani');

 insert into teste2 values('{2}', 'teste');
  • Em seguida realizei uma inserção na tabela teste3 através de um select na tabela2:
insert into teste3 (vetor, nome)
    select vetor, nome from teste2 where nome='dani'

Então, não é possível inserir dados em campos do tipo array, se o dado for do tipo "normal", como também não é possível realizar a conversão do tipo integer para integer[] através do cast.

Você pode ver um pouco mais sobre os tipos arrays, acessando a documentação do PostgreSQL.

Espero ter ajudado e bons estudos!

Opa, muito obrigado viu.

Ainda hoje vou tentar fazer o teste.

Acabei de testar.

O insert está inserindo uma nova linha de informações na tabela. Show,

Mas como que eu consigo inserir por exemplo :

  • Tenho o numero 2 dentro de um vetor {2} na tabela 1
  • Tenho o numero 3 dentro de um vetor {3} na tabela 2
  • Como consigo inserir esse numero da tabela 1, DENTRO do vetor da tabela 2. De forma a ficar {2,3} na tabela 2, na mesma linha.

Essa era a intenção desde o começo, mas acho que ficou mal explicado da minha parte.

solução!

Bom Rafael, isso não é possível, mas na documentação do PostgreSQL é explicado varias formas de se trabalhar com tipos de array, como também operadores disponível, e pode ajudar no que você deseja.

Bons estudos!