2017-05-18 5 views
0

Ich habe ein Tabellenformular, das ich brauche, um einige Informationen zu extrahieren. Diese Tabelle hat eine Oracle Spatial-Spalte (MDSYS.SDO_GEOMETRY), von der ich auch einige Daten benötige.Oracle: extrahiere Daten von MDSYS.SDO_GEOMETRY Spalte

ich mit einer einfachen Abfrage wie folgt begann:

select id, field1, field2 
FROM my_table; 

Danach war ich eine Schleife über das Ergebnis der Lage, die Daten zu extrahieren, die in der räumlichen Spalte war:

SELECT * 
     FROM TABLE (SELECT a.POSITIONMAP.sdo_ordinates 
          FROM my_table 
          WHERE ID = 18742084); 

die POSITIONMAP.sdo_ordinates scheint in der Regel 4 Werte zu halten, wie diese:

100050,887 
407294,948 
0,577464740471056 
-0,816415625470689 

ich das letzte brauchen 2 Werte. Ich kann das erreichen, indem die Abfrage in diesen Wechsel:

SELECT * FROM 
    (SELECT rownum AS num, 
      column_value AS orientatie 
     FROM TABLE (SELECT a.POSITIONMAP.sdo_ordinates 
          FROM my_table 
          WHERE ID = 18742084)) 
    WHERE num IN (3,4) 

jede Zeile von meiner ersten Abfrage Looping über die Daten aus der POSITIONMAP Spalte ist natürlich zu extrahieren nicht sehr Leistung freundlich, so meine Frage sehr schnell langsam wird.

Ich möchte alle Informationen in einer Abfrage abrufen, aber es gibt ein paar Dinge, die mich davon abhalten.

  • Nicht jede Zeile in der Tabelle hat Daten in POSITIONMAP
  • Einige Zeilen tun Daten in POSITIONMAP, aber sie enthalten nur zwei Werte (also nicht die 3. und 4. Wert, die ich suche.
  • ich brauche die Daten in einer Zeile für jede Zeile in der Tabelle (die vorherige Abfrage in doppelte Zeilen führen würde

der nächstgelegene ich habe ist:

select 
    id, 
    field1, 
    field2 
    t.* 
    FROM my_table v, 
    table (v.POSITIONMAP.sdo_ordinates) t 

Dies gibt meine 4 Zeilen für jede Zeile in my_table. Sobald ich versuche, die rownum Bedingung in diese Abfrage zu setzen, erhalte ich einen Fehler: "Ungültige user.table.column, table.column oder spalte specification"

Gibt es eine Möglichkeit zu kombinieren, was ich will in 1 Abfrage tun?

Antwort

1

können Sie sdo_util.getvertices wie folgt verwenden:

select t.x,t.y 
    from my_table mt 
     ,table(sdo_util.getvertices(mt.positionmap)) t 
where t.id = 2 

Ich gehe davon aus, dass Ihre Geometrien Linien (gtype = 2002) und Punkte (gtype = 2001). Wenn Sie X-, Y-Werte für Linien und leere Werte für einen Punkt möchten, können Sie nach der Eigenschaft sdo_gtype des Geometrieobjekts filtern.

select t.x,t.y 
    from my_table mt 
     ,table(sdo_util.getvertices(mt.positionmap)) t 
where t.id = 2 
and mt.positionmap.sdo_gtype=2002 
union all 
select null as X, 
     null as Y 
from my_table mt 
where mt.positionmap.sdo_gtype=2001 
+0

Danke, das ist eine sehr nützliche Funktion für meinen Zweck! Einige Zeilen haben jedoch Daten in POSITIONMAP, aber sie enthalten nur 2 Werte (also nicht den dritten und vierten Wert, nach dem ich suche, daher gibt es für diese Zeilen kein t.id mit Wert 2, und ich verliere diese Zeilen jetzt. Gibt es eine Möglichkeit, irgendeine Art von lefgt Join zu machen, so dass ich diese Zeilen nicht verliere, sondern null für x und y statt – ErikL

+0

Bearbeite meine Antwort – Rene

0

Eine Methode ist die ROW_NUMBER() analytische Funktion zu verwenden:

SELECT * 
FROM (
    select id, 
     field1, 
     field2, 
     t.*, 
     ROW_NUMBER() OVER (PARTITION BY v.id ORDER BY ROWNUM) AS rn 
    FROM my_table v, 
     TABLE(v.POSITIONMAP.sdo_ordinates) t 
) 
WHERE rn IN (3, 4)