Duvida sintaxe em SQL - PostgresSql
Ola, tenho tentado montar o esquema abaixo em sql no postgre mas não consegui.
Alguém expert por ai poderia me dizer como seria o correto?
.
.
Basicamente eu quero verificar: se um registro já existe eu modifico, senão incluo.
Alguém expert por ai poderia me dizer como seria o correto?
.
Select CASE when (select id_tabela as id from tabela where campo = 'conteudo') <> null then update tabela set campo = conteudo where id_tabela = id ELSE insert into tabela (campo) values (conteudo) END
.
Basicamente eu quero verificar: se um registro já existe eu modifico, senão incluo.
Alberto
Curtidas 0
Respostas
Luiz Vichiatto
05/05/2018
Select CASE when (select id_tabela as id from tabela where campo = 'conteudo') <> is not null then update tabela set campo = conteudo where id_tabela = id ELSE insert into tabela (campo) values (conteudo) END
Atenção pode ocorrer problemas, o "campo" da sua pesquisa pode estar populada com espaços, por exemplo, então atenção sobre este tipo de insert para que não tenha duplicação de itens desnecessariamente.
No site da documentação do postgreSQL pode ter mais detalhes, este é direto no item case https://www.postgresql.org/docs/9.2/static/functions-conditional.html
GOSTEI 0
Luiz Vichiatto
05/05/2018
Corrigindo que foi "<>" indevidamente, desculpas!
Select CASE when (select id_tabela as id from tabela where campo = 'conteudo') is not null then update tabela set campo = conteudo where id_tabela = id ELSE insert into tabela (campo) values (conteudo) END
GOSTEI 0
Alberto
05/05/2018
Olá, obrigado por comentar, mas a questao é que esse codigo que eu postei nao funciona, provavelmente porque a logica da linguagem sql está errada, gostaria de saber como implementar essa rotina com as instrucoes escritas numa logica que funcione no postgresql.
GOSTEI 0
Kleber Santos
05/05/2018
Você precisa de uma Procedure, segue abaixo:
CREATE OR REPLACE FUNCTION corrige(conteudo varchar(50), novo_conteudo varchar(50)) RETURNS VOID AS $$
DECLARE
resultado cliente.cliente_id%TYPE;
BEGIN
SELECT INTO resultado cliente_id FROM cliente WHERE cliente_nome = conteudo;
IF NOT FOUND THEN
INSERT INTO cliente(cliente_nome) VALUES (novo_conteudo);
RAISE NOTICE 'MESSAGES: Insert realizado com sucesso';
ELSE
UPDATE cliente SET cliente_nome = novo_conteudo WHERE cliente_nome = conteudo;
RAISE NOTICE 'MESSAGES: Update realizado com sucesso';
END IF;
END;
$$LANGUAGE 'plpgsql';
Para chamar a Procedure:
SELECT * FROM corrige('Marco', 'Marcos');
CREATE OR REPLACE FUNCTION corrige(conteudo varchar(50), novo_conteudo varchar(50)) RETURNS VOID AS $$
DECLARE
resultado cliente.cliente_id%TYPE;
BEGIN
SELECT INTO resultado cliente_id FROM cliente WHERE cliente_nome = conteudo;
IF NOT FOUND THEN
INSERT INTO cliente(cliente_nome) VALUES (novo_conteudo);
RAISE NOTICE 'MESSAGES: Insert realizado com sucesso';
ELSE
UPDATE cliente SET cliente_nome = novo_conteudo WHERE cliente_nome = conteudo;
RAISE NOTICE 'MESSAGES: Update realizado com sucesso';
END IF;
END;
$$LANGUAGE 'plpgsql';
Para chamar a Procedure:
SELECT * FROM corrige('Marco', 'Marcos');
GOSTEI 0