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);
quelle
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);
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$
.Nur um zu helfen, wenn jemand wie ich über diese Frage stolpert. Wenn 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
quelle
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;
quelle
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:
quelle