Oracle:从MDSYS.SDO_GEOMETRY列中提取数据

时间:2017-05-18 11:53:11

标签: sql oracle oracle-spatial

我有一个表格,我需要提取一些信息。这个表有一个oracle空间(MDSYS.SDO_GEOMETRY)列,我也需要一些数据。

我从一个简单的查询开始:

select id, field1, field2
FROM my_table;

之后,我能够遍历结果以提取空间列中的数据:

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

POSITIONMAP.sdo_ordinates似乎通常包含4个值,如下所示:

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

我需要最后2个值。我可以通过将查询更改为:

来实现这一目标
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)

从第一个查询中循环遍历每一行以从POSITIONMAP列中提取数据当然不是非常友好,所以我的查询很快就会变慢。

我想在一个查询中检索所有信息,但有一些事情阻止我这样做。

  • 并非表格中的每一行都有POSITIONMAP中的数据
  • 某些行在POSITIONMAP中有数据,但它们只包含2个值(因此不是我要查找的第3个和第4个值。
  • 我需要为表中的每一行提供一行数据(使用上一个查询会导致重复行

我最接近的是:

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

这为my_table中的每一行提供了4行。 一旦我尝试将rownum条件放入此查询中,我就会收到错误:“user.table.column,table.column或column specification invalid”

有没有办法将我想做的事情合并到一个查询中?

2 个答案:

答案 0 :(得分:2)

您可以按如下方式使用sdo_util.getvertices:

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

我假设你的几何是线(gtype = 2002)和points(gtype = 2001)。如果你想要行的X,Y值和点的空值,你可以过滤几何对象的sdo_gtype属性。

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

答案 1 :(得分:0)

一种方法是使用ROW_NUMBER()分析函数:

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 )