Erzeuge mehrere Zeilen für einen Datensatz

Caidou

Neuer Benutzer
Beiträge
2
Hallo zusammen,

habe mal eine Frage zu einem Select.
Sagen wir mal, ich habe insgesamt 10 Spalten. 5 davon sind J/N Felder. Jetzt möchte ich das so variabel haben, dass wenn z.B. drei dieser J/N Felder den Wert J haben, dass drei Zeilen ausgegeben werden, die den gleichen Inhalt haben - nur dass je Datensatz die anderen beiden als N ausgegeben werden. Denke mal, das ist blöd beschrieben. Ich zeige das mal auf:

+---+---+---+---+---+---+---+---+---+---+
| J | J | J | N | N | N | N | N | N | N |
+---+---+---+---+---+---+---+---+---+---+

Ausgabe:

J;N;N;N;N;N;N;N;N;N
N;J;N;N;N;N;N;N;N;N
N;N;J;N;N;N;N;N;N;N

Hoffe, dass das verständlich ist. Danke schonmal!
 
Werbung:
Code:
test=*# select * from caldou ;
 b1 | b2 | b3 |     t    
----+----+----+-----------
 t  | t  | t  | demo text
(1 Zeile)

test=*# select x.b1, x.b2, x.b3, c.t from caldou c left join lateral (select true b1, false b2, false b3 union all select false, true, false union all select false, false, true) x on (c.b1 and c.b2 and c.b3);
 b1 | b2 | b3 |     t    
----+----+----+-----------
 t  | f  | f  | demo text
 f  | t  | f  | demo text
 f  | f  | t  | demo text
(3 Zeilen)

Das ist aber jetzt PostgreSQL
 
Code:
test=*# select * from caldou ;
 b1 | b2 | b3 |     t   
----+----+----+-----------
 t  | t  | t  | demo text
(1 Zeile)

test=*# select x.b1, x.b2, x.b3, c.t from caldou c left join lateral (select true b1, false b2, false b3 union all select false, true, false union all select false, false, true) x on (c.b1 and c.b2 and c.b3);
 b1 | b2 | b3 |     t   
----+----+----+-----------
 t  | f  | f  | demo text
 f  | t  | f  | demo text
 f  | f  | t  | demo text
(3 Zeilen)

Das ist aber jetzt PostgreSQL

Hi akretschner,

danke für deinen Input! Was mache ich aber, wenn ich den Select variabel gestalten will?

Sprich, wenn ich auch Felder habe, die tatsächlich nur einen J-Wert in der Zeile haben und somit korrekt nur 1x dargestellt werden sollen?

Geht das über einen Select überhaupt, oder muss ich da einen Trigger schreiben, der reagiert, wenn in Zeile Anzahl Felder J größer 1?

Schöne Grüße

Caidou
 
nun ja, geht alles...

Code:
test=*# select * from caldou ;
 b1 | b2 | b3 |        t         
----+----+----+------------------
 t  | t  | t  | demo text
 f  | f  | f  | alles false
 t  | f  | f  | true false false
 f  | t  | f  | false true false
 f  | f  | t  | false false true
 t  | f  | t  | true false true
(6 Zeilen)

test=*# select x.b1, x.b2, x.b3, c.t from caldou c left join lateral (select true b1, false b2, false b3 union all select false, true, false union all select false, false, true) x on (c.b1 and c.b2 and c.b3) where (c.b1 and c.b2 and c.b3) union all select * from caldou where not (b1 and b2 and b3);
 b1 | b2 | b3 |        t         
----+----+----+------------------
 t  | f  | f  | demo text
 f  | t  | f  | demo text
 f  | f  | t  | demo text
 f  | f  | f  | alles false
 t  | f  | f  | true false false
 f  | t  | f  | false true false
 f  | f  | t  | false false true
 t  | f  | t  | true false true
(8 Zeilen)

test=*#
 
Werbung:
Zurück
Oben