sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL IF-instructie

DO
$do$
BEGIN
   IF EXISTS (SELECT FROM orders) THEN
      DELETE FROM orders;
   ELSE
      INSERT INTO orders VALUES (1,2,3);
   END IF;
END
$do$

Er zijn geen procedurele elementen in standaard SQL. De IF statement maakt deel uit van de standaard proceduretaal PL/pgSQL. U moet een functie maken of een ad-hocstatement uitvoeren met de DO commando.

Je hebt een puntkomma nodig (; ) aan het einde van elke instructie in plpgsql (behalve de laatste END ).

Je hebt END IF; . nodig aan het einde van de IF verklaring.

Een subselectie moet tussen haakjes staan:

    IF (SELECT count(*) FROM orders) > 0 ...

Of:

    IF (SELECT count(*) > 0 FROM orders) ...

Dit is echter equivalent en veel sneller:

    IF EXISTS (SELECT FROM orders) ...

Alternatief

De extra SELECT is niet nodig. Dit doet hetzelfde, sneller:

DO
$do$
BEGIN
   DELETE FROM orders;
   IF NOT FOUND THEN
      INSERT INTO orders VALUES (1,2,3);
   END IF;
END
$do$

Hoewel het onwaarschijnlijk is, kunnen gelijktijdige transacties die naar dezelfde tabel schrijven, interfereren. Om absoluut zeker te zijn, vergrendelt u de tafel in dezelfde transactie voordat u verder gaat zoals aangetoond.



  1. Hoe tekst af te kappen met een ellips in MariaDB

  2. Snelle MySQL-tip:de functie LENGTH en TRIM gebruiken

  3. Compatibiliteitsniveaus en Cardinality Estimation Primer

  4. Ingesloten Postgres voor lente-opstarttests