array de integer [RESOLVIDO]

1. array de integer [RESOLVIDO]

Carlos Fagiani Junior
terabytes

(usa Slackware)

Enviado em 17/06/2013 - 13:01h


CREATE TABLE agenda (
	chave SERIAL NOT NULL,
	nome VARCHAR(100) NOT NULL,
	rua VARCHAR(200),
	numero INT,
	telefone char(9),
	PRIMARY KEY(chave)
);

-- DROP TABLE ListaInvertida;
-- CRIA TABELA listaInvertida --
CREATE TABLE ListaInvertida (
	palavra VARCHAR(30),
	chave INTEGER[]
);
 


To querendo fazer uma sistema de lista invertido, quando adicionar uma informação na tabela 'agenda' irá ativar a trigger que chama essa função:

para cada palavra do nome e do endereço inseridos na 'agenda', ele deve criar um indice, até ai tudo bem.

Só caso haja palavras repetidas, erá para no campo chave criar um array de inteiros, e isso nõa estou conseguindo fazer... Alguem têm uma dica??



CREATE OR REPLACE FUNCTION PopulaListaInvertida() RETURNS trigger AS $$
	DECLARE
		dado VARCHAR;
		dado2 VARCHAR;
		existe integer;
	BEGIN
		-- unnest CRIA UMA "TABELA" DIVIDINDO O TEXTO PELO DELIMITADOR ESPAÇO
		-- LOOP PARA O NOME
		FOR dado IN SELECT unnest(string_to_array(new.nome, ' ')) LOOP
			existe:=0;
			SELECT count(*) INTO existe FROM ListaInvertida WHERE palavra=dado;
			if existe=0 then
				INSERT INTO ListaInvertida (palavra, chave) VALUES (dado, new.chave);
			else
				UPDATE ListaInvertida SET chave=array[chave,new.chave] where palavra=dado;
			end if;
		END LOOP;
		-- LOOP PARA O ENDEREÇO
		FOR dado2 IN SELECT unnest(string_to_array(new.rua, ' ')) LOOP
			existe :=0;
			SELECT count(*) INTO existe FROM ListaInvertida WHERE palavra=dado;
			IF existe=0 then
				INSERT INTO ListaInvertida (palavra, chave) VALUES (dado2, new.chave);
			ELSE
				UPDATE ListaInvertida SET chave=string_to_array[chave,new.chave] where palavra=dado;
			END IF;
		END LOOP;
	RETURN NEW;
	END;
	$$
LANGUAGE 'plpgsql';
 



Eu sei que eu posso reduzir esses 2 loops concatenando, mas isso é o de menos... Quero é saber dar um update com array no campo chava da TabelaInvertida.

vlw,


  


2. Re: array de integer [RESOLVIDO]

Buckminster
Buckminster

(usa Debian)

Enviado em 17/06/2013 - 13:43h

Bom, estou meio enferrujado em Postgresql, mas veja a sintaxe correta no link abaixo na seção "8.15.4. Modifying Arrays". Se não for a versão corereta do teu PostgreSql, clique na sua versão em cima da página.

http://www.postgresql.org/docs/9.2/static/arrays.html


3. Re: array de integer [RESOLVIDO]

Carlos Fagiani Junior
terabytes

(usa Slackware)

Enviado em 17/06/2013 - 17:18h

Já tinha lido a documentação, mas ela não fala sobre adicionar valores ao array já existente.
Mas mesmo assim obrigado.

Consegui fazer assim...

UPDATE ListaInvertida SET chave=chave || new.chave where palavra=dado;




CREATE OR REPLACE FUNCTION PopulaListaInvertida() RETURNS trigger AS $$
	DECLARE
		dado VARCHAR;
		dado2 VARCHAR;
		existe integer;
	BEGIN
		-- unnest CRIA UMA "TABELA" DIVIDINDO O TEXTO PELO DELIMITADOR ESPAÇO
		-- LOOP PARA O NOME
		FOR dado IN SELECT unnest(string_to_array(new.nome, ' ')) LOOP
			existe:=0;
			SELECT count(*) INTO existe FROM ListaInvertida WHERE palavra=dado;
			if existe=0 then
				INSERT INTO ListaInvertida VALUES (dado, ARRAY[new.chave]);
			else
				UPDATE ListaInvertida SET chave=chave || new.chave where palavra=dado;
			end if;
		END LOOP;
		-- LOOP PARA O ENDEREÇO
		FOR dado2 IN SELECT unnest(string_to_array(new.rua, ' ')) LOOP
			existe:=0;
			SELECT count(*) INTO existe FROM ListaInvertida WHERE palavra=dado2;
			IF existe=0 then
				INSERT INTO ListaInvertida VALUES (dado2, array[new.chave]);
			ELSE
				UPDATE ListaInvertida SET chave=chave || new.chave where palavra=dado2;
			END IF;
		END LOOP;
	RETURN NEW;
	END;
	$$
LANGUAGE 'plpgsql';
 







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts