[英]how to update or insert MDSYS.SDO_GEOMETRY more than one polygon
[英]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列中提取数据当然对性能不太友好,因此我的查询很快变慢。
我想在一个查询中检索所有信息,但是有一些事情使我无法这样做。
我最接近的是:
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.