wake-up-neo.net

PostgreSQL IF-Anweisung

Wie kann ich eine solche Abfrage in Postgres durchführen?

IF (select count(*) from orders) > 0
THEN
  DELETE from orders
ELSE 
  INSERT INTO orders values (1,2,3);
57

Versuchen:

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

Hauptpunkte

  • In Standard-SQL gibt es keine prozeduralen Elemente. Die IF Anweisung ist Teil der Standardprozedursprache PL/pgSQL. Sie müssen eine Funktion erstellen oder eine Ad-hoc-Anweisung mit dem Befehl DO ausführen.

  • Du brauchst ein ; am Ende jeder Anweisung in plpgsql ( mit Ausnahme des letzten END ).

  • Du brauchst END IF; am Ende der Anweisung IF.

  • Eine Unterauswahl muss von Klammern umgeben sein:

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

    Oder:

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

    Dies ist jedoch äquivalent und viel schneller:

    IF EXISTS (SELECT FROM orders) ...
    

Alternative

Sie brauchen hier überhaupt kein zusätzliches SELECT. Das geht genauso, etwas schneller:

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

Obwohl dies unwahrscheinlich ist, kann eine gleichzeitige Transaktion, die versucht, in dieselbe Tabelle zu schreiben, zu Interferenzen führen. Um ganz sicher zu sein, Schreibsperre die Tabelle in derselben Transaktion, bevor Sie wie gezeigt fortfahren.

105

Nur um zu helfen, wenn jemand wie ich über diese Frage stolpert, wenn Sie sie in PostgreSQL verwenden möchten, verwenden Sie "CASE".

select 
    case
        when stage = 1 then 'running'
        when stage = 2 then 'done'
        when stage = 3 then 'stopped'
    else 
        'not running'
    end as run_status from processes
24
Mahmood

Aus dem docs

IF boolean-expression THEN
    statements
ELSE
    statements
END IF;

In Ihrem obigen Beispiel sollte der Code folgendermaßen aussehen:

IF select count(*) from orders > 0
THEN
  DELETE from orders
ELSE 
  INSERT INTO orders values (1,2,3);
END IF;

Sie haben gefehlt: END IF;

8
Woot4Moo

Sie können auch die Grundstruktur für PL/pgSQL CASE mit anonymer Codeblock Prozedurblock verwenden:

DO $$ BEGIN
    CASE
        WHEN boolean-expression THEN
          statements;
        WHEN boolean-expression THEN
          statements;
        ...
        ELSE
          statements;
    END CASE;
END $$;

Verweise:

  1. http://www.postgresql.org/docs/current/static/sql-do.html
  2. https://www.postgresql.org/docs/current/static/plpgsql-control-structures.html
5
user