Duvida sintaxe em SQL - PostgresSql

PostgreSQL

05/05/2018

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?
.
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

Alberto

Curtidas 0

Respostas

Luiz Vichiatto

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

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

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

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');

GOSTEI 0
POSTAR