Re: Zusammenfassung mehrerer boolean Spalten

Albe Laurenz <[email protected]> Wed, 18 Nov 2015 15:55:09 +0000
Newsgroups gmane.comp.db.postgresql.german
Message-ID <A737B7A37273E048B164557ADEF4A58B50FE72CF@ntex2010i.host.magwien.gv.at>
Gunnar Oehmichen wrote:
> Folgendes Problem:
> 
> Ich habe zwei räumliche Tabellen (PostGIS) Kat und Geb.
> Ich teste mit unterschiedlichen PostGIS Funktionen ob sich die einzelnen
> Geometrien (Multipolygone) der beiden Tabellen überschneiden/überlagern
> etc (also ob diese Flächen miteinander Teilen):
> 
> zB:
> 
> SELECT Kat.id AS kat_id, Geb.id AS geb_id,
> 
> ST_Intersects (Kat.geom, Geb.geom) AS Kat_inters_Geb,
> ST_Contains (Kat.geom, Geb.geom) AS Kat_contains_Geb,
> ST_Within (Kat.geom, Geb.geom) AS Kat_in_Geb
> 
> FROM Kat CROSS JOIN Geb;
> 
> Alle drei (und weitere nicht gezeigte) ST_ Funktionen haben einen
> boolean Output.
> 
>   kat_id geb_id kat_inters_geb kat_contains_geb kat_in_geb
> 1 130294   3214          FALSE            FALSE      FALSE
> 2 130294   3215          FALSE            FALSE      FALSE
> 3 130294   3216          FALSE            FALSE      FALSE
> 
> Ich würde gerne in der gleichen Abfrage mir eine Spalte ausgeben lassen,
> welche bezeichnet ob überhaupt in einer Reihe einer der Vergleiche TRUE
> ist (oder wie viele TRUE sind).

Sowas in der Art:

WITH t AS 
   (SELECT Kat.id AS kat_id, Geb.id AS geb_id,
   ST_Intersects (Kat.geom, Geb.geom) AS Kat_inters_Geb,
   ST_Contains (Kat.geom, Geb.geom) AS Kat_contains_Geb,
   ST_Within (Kat.geom, Geb.geom) AS Kat_in_Geb)
SELECT kat_id, geb_id, kat_inters_geb, kat_contains_geb, kat_in_geb,
       kat_inters_geb OR kat_contains_geb OR kat_in_geb AS any_true
FROM t

Ich habe es nicht getestet, aber das Konzept sollte klar sein.

> Außerdem, wenn möglich eine Spalte welche die Spalte(n) bezeichnet
> welche TRUE ist/sind.
> 
> Ist dies möglich? Es dürfte sicherlich keine Rolle spielen, dass ich
> hier spezielle PostGIS Funktionen nutze, sondern der Output müsste
> entscheidend sein.

In der äußeren Abfrage könnte ein Konstrukt stehen wie:

CASE WHEN kat_inters_geb
     THEN 'kat_inters_geb'
     WHEN kat_contains_geb
     THEN 'kat_contains_geb'
     WHEN kat_in_geb
     THEN 'kat_in_geb'
     ELSE NULL
END

Liebe Grüße,
Laurenz Albe


-- 
Sent via pgsql-de-allgemein mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein