# Postgres DB-Befehl Fehler mit "IF EXISTS"

**URL:** <https://www.pg-forum.de/t/postgres-db-befehl-fehler-mit-if-exists/565>\
**Category:** PL/pgSQL\
**Created:** [18. Juni 2019 um 07:53 UTC](https://www.pg-forum.de/t/postgres-db-befehl-fehler-mit-if-exists/565 "2019-06-18T07:53:53Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![anon91471933](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon91471933](https://www.pg-forum.de/u/anon91471933)\
**Post date:** [18. Juni 2019 um 07:53 UTC](https://www.pg-forum.de/t/postgres-db-befehl-fehler-mit-if-exists/565/1 "2019-06-18T07:53:53Z")

</div>

Hi,

vermutlich ein sehr leichter Fehler, aber ich komme nicht dahinter.  
Fehlermeldung

```nohighlight
ERROR: FEHLER: Syntaxfehler bei »IF« LINE 2: IF EXISTS(select * from hd_here.physical_width where hd_... ^ SQL state: 42601 Character: 11

```

hilft mir auch nicht weiter.

Bin bisher leider nur MySQL gewöhnt und bin mir momentan nicht sicher, ob ich einen groben Denkfehler mache oder das bei Postgres-DBen einfach anders funktioniert.

Mein Code:

```nohighlight
BEGIN
    IF EXISTS(select * from hd_here.physical_width where hd_here.physical_width.lane_id = '0') THEN
        INSERT into public.hd_link_validation (link_id, a_o_lanes, avg_lane_width_0) VALUES (hd_here.physical_width.lane_group_id, hd_here.physical_width.lane_id, hd_here.physical_width.value)
    END IF

    IF EXISTS(select * from hd_here.physical_width where hd_here.physical_width.lane_id = '1') THEN
        UPDATE public.hd_link_validation SET ao_lanes ='1', avg_lane_width_1 = hd_here.physical_width.value WHERE id = hd_here.physical_width.lane_group_id
	ELSE
	    UPDATE public.hd_link_validation SET ao_lanes ='0', avg_lane_width_1 = '0' WHERE id = hd_here.physical_width.lane_group_id
    END IF

    IF EXISTS(select * from hd_here.physical_width where hd_here.physical_width.lane_id = '2') THEN
        UPDATE public.hd_link_validation SET ao_lanes ='2', avg_lane_width_2 = hd_here.physical_width.value WHERE id = hd_here.physical_width.lane_group_id
	ELSE
	    UPDATE public.hd_link_validation SET ao_lanes ='1', avg_lane_width_2 = '0' WHERE id = hd_here.physical_width.lane_group_id
    END IF

    IF EXISTS(select * from hd_here.physical_width where hd_here.physical_width.lane_id = '3') THEN
        UPDATE public.hd_link_validation SET ao_lanes ='3', avg_lane_width_3 = hd_here.physical_width.value WHERE id = hd_here.physical_width.lane_group_id
	ELSE
	    UPDATE public.hd_link_validation SET ao_lanes ='2', avg_lane_width_3 = '0' WHERE id = hd_here.physical_width.lane_group_id
    END IF
END;

```

Was ich versuche:  
Die Tabelle “hd\_link\_validation” (Schema: public) zu befüllen.

Die Tabelle hat folgende Struktur:

```nohighlight
link_id(PK)|a_o_lanes|curvature|predecessor|assesor|avg_road_width|avg_lane_width_0|avg_lane_width_1|avg_lane_width_2|avg_lane_width_3

```

Die Daten sind in den anderen Tabellen des Schemas “hd\_here” vorhanden.  
Bspw. in der Tabelle “physical\_width”  
Mehrere Datensätze in Physical\_width können bspw. so aussehen:

```nohighlight
...|lane_group_id|lane_id|value|...
...|1|0|3.7|...
...|1|1|3.5|...
...|1|2|3.6|...
...|2|0|3.6|...
...|2|1|3.6|...

```

Wer die Anwendung verstehen will:  
“HD\_Link\_Validation” soll Autobahnabschnitte speichern, dazu die gesamte Anzahl von Spuren, die durchschnittliche Fahrbahnbreite und die durchschnittliche Breite der einzelnen Spuren (0 bis 3). Spur 0 ist der Standstreifen, Spur 1-3 sind die Fahrspuren. Da nicht jede Fahrspur vorhanden ist, wird mit “IF EXISTS” und “ELSE” gearbeitet. In “physical\_width” stehen die breiten einzelner Spuren (lane\_id). Die “lane\_group\_id” bündelt mehrere Spuren zu einem Autobahnabschnitt.

Für meine Untersuchung (maschinelles Lernen) brauche ich aber die Daten in einer anderen Struktur (abhängig nur von der lane\_group\_id), also in der Struktur, die ich in “HD\_Link\_Validation” vorgegeben habe. Ich möchte dafür einfach nur die Daten (aus anderen Tabellen werden auch noch Infos abgeleitet) so aufbereiten, dass alle Merkmale dafür vorliegen, die ich für ein einfaches Modell brauche.

---

<div class="post-metadata">

**Author:** ![castorp](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/c/e99b99/32.png) [@castorp](https://www.pg-forum.de/u/castorp)\
**Post date:** [18. Juni 2019 um 08:37 UTC](https://www.pg-forum.de/t/postgres-db-befehl-fehler-mit-if-exists/565/2 "2019-06-18T08:37:34Z")

</div>

IF oder BEGIN sind keine SQL Befehle, sondern PL/pgSQL Anweisungen. Wenn das nicht Teil einer Funktion/Prozedur ist, dann klappt das so sowieso nicht. Wenn das Teil einer Funktion ist, dann zeig uns bitte den komplette code.

Letztendlich brauchst Du aber gar kein IF EXISTS. Wenn ich das richtig verstehe kannst Du das durch INSERT ON CONFLICT DO NOTHING bzw. INSERT ON CONFLICT DO UPDATE ersetzen.

---

<div class="post-metadata">

**Author:** ![pogomips](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/p/bbe5ce/32.png) [@pogomips](https://www.pg-forum.de/u/pogomips)\
**Post date:** [21. Juni 2019 um 07:06 UTC](https://www.pg-forum.de/t/postgres-db-befehl-fehler-mit-if-exists/565/3 "2019-06-21T07:06:15Z")

</div>

Ein paar Anmerkungen:

1. Ein Begin/End könnte auch ein anonymer Block sein. Ich weiß nicht seit wann mySQL das könnte (vielleicht \>8?), pg kann es jedenfalls schon ewig. Nur nicht so, wie hier geschrieben
2. Wenn 1, dann würde auch ein if then else funktionieren
3. Es wäre aber wie schon geschrieben tatsächlich nicht nötig
4. Es wäre wahrscheinlich auch keine Kleinklein mit on conflict nötig
5. Auch wenn ich den Sinn des Statements und die Richtigkeit der Einzelschritte bezweifel (vermutlich ist der “Reifegrad” des gezeigt SQL wegen der grundsätzlichen Fehler noch gering), man kann es wahrscheinlich mit einem einzigen aggregierenden Select durchführen, also nur Insert ohne updates, vielleicht mit Case
6. Wg 5. dann sicher auch schnell(er)

---

<div class="post-metadata">

**Author:** ![anon91471933](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon91471933](https://www.pg-forum.de/u/anon91471933)\
**Post date:** [11. Juli 2019 um 09:37 UTC](https://www.pg-forum.de/t/postgres-db-befehl-fehler-mit-if-exists/565/4 "2019-07-11T09:37:45Z")

</div>

Kann ich das Thema selbst schließen, wenn ich mein Problem inzwischen lösen konnte?

---

<div class="post-metadata">

**Author:** ![castorp](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/c/e99b99/32.png) [@castorp](https://www.pg-forum.de/u/castorp)\
**Post date:** [11. Juli 2019 um 09:45 UTC](https://www.pg-forum.de/t/postgres-db-befehl-fehler-mit-if-exists/565/5 "2019-07-11T09:45:46Z")

</div>

Wenn Du eine Lösung gefunden hast, dann wäre es nur nett, wenn Du sie uns auch verrätst und hier reinschreibst.

Einen Status “gelöst” gibt es hier meines Wissens nach nicht

---

<div class="post-metadata">

**Author:** ![system](https://www.pg-forum.de/uploads/default/original/1X/dc97a981dd26692d5fb52e8b8fc7c090d7b9559a.png) [@system](https://www.pg-forum.de/u/system)\
**Post date:** [21. Februar 2021 um 07:10 UTC](https://www.pg-forum.de/t/postgres-db-befehl-fehler-mit-if-exists/565/6 "2021-02-21T07:10:23Z")

</div>


