繁体   English   中英

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

[英]Oracle: extract data from MDSYS.SDO_GEOMETRY column

我有一个表格表格,我需要提取一些信息。 该表具有一个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

我需要最后两个值。 我可以通过将查询更改为此来实现:

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或列规范”

有什么方法可以将我想做的事情组合到1个查询中?

您可以按以下方式使用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)和点(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

一种方法是使用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 )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM