Wenn Schlüssel in anderer Tabelle vorhanden: ja

derhenry

Fleissiger Benutzer
Beiträge
54
Moin,
ich habe eine Vertragstabelle, aus der ich einige Informationen ausgebe. Diese Ausgabe möchte ich um eine ja/nein-Spalte mit der Bezeichnung "Klausel" erweitern. Die Ausprägung ist davon abhängig, ob ich zu diesem Vertrag (Vertragsnummer) einen Eintrag in der Klausel-Tabelle habe. WAS in der Klauseltabelle im Detail steht ist erst einmal irrelevant, mir geht es nur darum, OB da etwas zum Vertrag steht.

Wahrscheinlich mache ich das mit EXIST, oder? Ich habe nur leider kein Beispiel gefunden...

Danke und Grüße
derhenry
 
Werbung:
so vielleicht?

Code:
postgres=# select * from vertrag ;
 id |   name    
----+-----------
  1 | vertrag 1
  2 | vertrag 2
(2 rows)

postgres=# select * from klausel ;
 vertrag 
---------
       1
(1 row)

postgres=# select v.*, case when count(k.*) > 0 then 'ja' else 'nein' end as "Klausel?" from vertrag v left join klausel k on v.id=k.vertrag group by v.id, v.name;
 id |   name    | Klausel? 
----+-----------+----------
  2 | vertrag 2 | nein
  1 | vertrag 1 | ja
(2 rows)

postgres=#
 
Hey, das Ergebnis sieht super aus, danke.
Auf das count wäre ich nicht gekommen.
Warum gruppierst Du da noch?

Beim Umsetzen auf mein Szenario ist mir noch eine Schwierigkeit aufgefallen: Auf das Beispiel übertragen bedeutet das, dass die Vertragsnummer in V so nicht vorliegt: Sie ist erst aus den Teilen "Vertrag" und "Nummer" zusammenzusetzen. Dabei liegt "Vertrag" in der gejointen Tabelle a und "Nummer in b. Ausgeben kann ich es mit
TRIM(a.vertrag) || TRIM(b.nummer) Vertragsnummer
Kann ich das als Join-Kriterium nehmen?
 
Warum gruppierst Du da noch?
weil es ohne so enden würde:

Code:
postgres=# select v.*, case when count(k.*) > 0 then 'ja' else 'nein' end as "Klausel?" from vertrag v left join klausel k on v.id=k.vertrag;
ERROR:  column "v.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select v.*, case when count(k.*) > 0 then 'ja' else 'nein' e...
               ^
postgres=#

Wie Du das joinst ist ein anderes Problem. Kapottes Tabellendesign?
 
Gruppieren macht nur Sinn wenn in der klausel-Tabelle mehr als ein Datensatz zum Vertrag sein kann. Wenn das nicht so ist reicht
Code:
select v.*, case when k.vertrag is not null then 'ja' else 'nein' end as "Klausel?" from vertrag v left join klausel k on v.id=k.vertrag;
Wenn mehrere Datensätze in klausel kämen dann halt auch mehrere Zeilen Ergebnis zustande.

Du kannst auch auf zusammen gesetzte Zeichenketten etc. joinen, du musst nur Syntax und Datentypen genau treffen.
 
Beim Umsetzen auf mein Szenario ist mir noch eine Schwierigkeit aufgefallen: Auf das Beispiel übertragen bedeutet das, dass die Vertragsnummer in V so nicht vorliegt: Sie ist erst aus den Teilen "Vertrag" und "Nummer" zusammenzusetzen. Dabei liegt "Vertrag" in der gejointen Tabelle a und "Nummer in b. Ausgeben kann ich es mit
TRIM(a.vertrag) || TRIM(b.nummer) Vertragsnummer
Kann ich das als Join-Kriterium nehmen?
Ah, mit
LIKE ('%' || TRIM(ez.EZ_NUMMER) || TRIM(ri.RISIKO) || '%')
klappt es.
 
Warum nur mit LIKE? Nicht sehr elegant und unter Umständen problematisch. Der Schlüssel müsste sich doch auch exakt nachbilden lassen.
 
Werbung:
Zurück
Oben