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);
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);
Antworten:
DO
$do$
BEGIN
IF EXISTS (SELECT FROM orders) THEN
DELETE FROM orders;
ELSE
INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$
In Standard-SQL gibt es keine prozeduralen Elemente. Die IF
Anweisung ist Teil der Standardprozedursprache PL / pgSQL. Sie müssen mit dem DO
Befehl eine Funktion erstellen oder eine Ad-hoc-Anweisung ausführen .
Sie benötigen ein Semikolon ( ;
) am Ende jeder Anweisung in plpgsql (mit Ausnahme des FinalesEND
).
Sie müssen END IF;
am Ende der IF
Anweisung.
Eine Unterauswahl muss in Klammern stehen:
IF (SELECT count(*) FROM orders) > 0 ...
Oder:
IF (SELECT count(*) > 0 FROM orders) ...
Dies ist jedoch gleichwertig und viel schneller:
IF EXISTS (SELECT FROM orders) ...
Das zusätzliche SELECT
wird nicht benötigt. Das geht genauso, 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, können gleichzeitige Transaktionen, die in dieselbe Tabelle geschrieben werden, stören. Um absolut sicher zu sein, sperren Sie die Tabelle in derselben Transaktion, bevor Sie wie gezeigt fortfahren.
%
in meinem Code finden? IOW: Die obigen Anweisungen funktionieren. Sie haben einen nicht verwandten Syntaxfehler eingeführt. Sieht aus wie Sie getippt %do%
statt $do$
.
Aus den Dokumenten
IF boolean-expression THEN
statements
ELSE
statements
END IF;
In Ihrem obigen Beispiel sollte der Code also wie folgt 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;
DO
, damit es als SQL-Anweisung und nicht in einer PL / pgSQL-Funktion verwendet werden kann.
Sie können auch die Grundstruktur für den PL / pgSQL-Fall mit anonymem Codeblock- Prozedurblock verwenden:
DO $$ BEGIN
CASE
WHEN boolean-expression THEN
statements;
WHEN boolean-expression THEN
statements;
...
ELSE
statements;
END CASE;
END $$;
Verweise: