sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo ACTUALIZAR/INSERTAR condicionalmente después de ELIMINAR que no encuentra filas?

Si el DELETE no encuentra fila calificada, es RETURNING la cláusula devuelve sin filas .

El título pide "ACTUALIZAR/INSERTAR condicionalmente después de ELIMINAR" , pero el cuerpo se queja de que "falla si no hay una fila para eliminar" . Si la existencia de una fila para eliminar no es la condición, entonces ¿cuál es la condición?

Arriesgándose, esto podría sé lo que quieras:

CREATE FUNCTION updateoutfit(_id UUID, _title text DEFAULT NULL::text, _garments json)
  RETURNS TABLE (id UUID, title text, garments json)
  LANGUAGE sql AS
$func$
DELETE FROM outfit_garment WHERE outfit_id = _id;  -- DELETE if exists

INSERT INTO outfit (id, title)  -- UPSERT outfit
VALUES (_id, _title)
ON CONFLICT (id) DO UPDATE
SET    title = EXCLUDED.title;
   
WITH ins AS (  -- INSERT new rows in outfit_garment
   INSERT INTO outfit_garment (position_x, outfit_id)
   SELECT "positionX", _id
   FROM   json_to_recordset(_garments) AS x("positionX" float)  -- outfit_id UUID was unused!
   RETURNING json_build_object('positionX', position_x) AS garments
   )
SELECT _id, _title, json_agg(garments)
FROM   ins
GROUP  BY id, title;
$func$;

Elimina todas las filas de la tabla outfit_garment para el UUID dado, luego inserta o actualiza una fila en la tabla outfit y finalmente agrega nuevas filas de detalles en la tabla outfit_garment . Cualquier outfit_id pasado en _garments se ignoran.
Luego devuelve una sola fila con todas las prendas fusionadas en un valor JSON.