Condicional INSERTAR EN la declaración en postgres


Estoy escribiendo un procedimiento de reserva para una base de datos de reservas de aerolíneas simuladas y lo que realmente quiero hacer es algo como esto:

IF EXISTS (SELECT * FROM LeadCustomer 
    WHERE FirstName = 'John' AND Surname = 'Smith') 
THEN
   INSERT INTO LeadCustomer (Firstname, Surname, BillingAddress, email) 
   VALUES ('John', 'Smith', '6 Brewery close,
            Buxton, Norfolk', [email protected]');

Pero Postgres no soporta sentencias IF sin cargar la extensión PL/PgSQL. Me preguntaba si había una manera de hacer algo equivalente a esto o si solo va a tener que haber alguna interacción del usuario en este paso.

Author: Meredith, 2013-03-29

2 answers

Ese comando específico se puede hacer así:

insert into LeadCustomer (Firstname, Surname, BillingAddress, email)
select 
    'John', 'Smith', 
    '6 Brewery close, Buxton, Norfolk', '[email protected]'
where not exists (
    select * from leadcustomer where firstname = 'John' and surname = 'Smith'
);

Insertará el resultado de la instrucción select, y el select solo devolverá una fila si ese cliente no existe.

 53
Author: Clodoaldo Neto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-09 01:30:00

A partir de la versión 9.5 de pgsql se incluye upsert, utilizando INSERT ... EN CONFLICTO ACTUALIZAR ...

La respuesta a continuación ya no es relevante. Postgres 9.5 fue lanzado un par de años más tarde con una solución mejor.

Postgres no tiene la funcionalidad "upsert" sin añadir nuevas funciones.
Lo que tendrá que hacer es ejecutar la consulta select y ver si tiene filas coincidentes. Si lo haces, entonces insértalo.

Sé que no quieres un upsert exactamente, pero es más o menos lo mismo.

 1
Author: Trenton Trama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-15 21:20:22