我有一个表格,我需要提取一些信息。这个表有一个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列中提取数据当然不是非常友好,所以我的查询很快就会变慢。
我想在一个查询中检索所有信息,但有一些事情阻止我这样做。
我最接近的是:
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”
有没有办法将我想做的事情合并到一个查询中?
答案 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 )