Oracle:从 MDSYS.SDO_GEOMETRY 列中提取数据
Oracle: extract data from MDSYS.SDO_GEOMETRY column
我有一个 table 表格,我需要从中提取一些信息。这个 table 有一个 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 列中提取数据当然对性能不是很友好,因此我的查询很快变慢。
我想在一个查询中检索所有信息,但有一些事情阻止我这样做。
- 并非 table 中的每一行在 POSITIONMAP
中都有数据
- 有些行在 POSITIONMAP 中确实有数据,但它们只包含 2 个值(所以不是我要查找的第 3 个和第 4 个值。
- 我需要 table 中每一行的一行数据(使用上一个查询会导致重复的行
我得到的最接近的是:
select
id,
field1,
field2
t.*
FROM my_table v,
table (v.POSITIONMAP.sdo_ordinates) t
这为 my_table 中的每一行提供了 4 行。
一旦我尝试将 rownum 条件放入此查询中,我就会收到错误消息:"invalid user.table.column, table.column, or column specification"
有什么方法可以将我想做的事情合并到 1 个查询中吗?
一种方法是使用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 )
您可以按如下方式使用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
我有一个 table 表格,我需要从中提取一些信息。这个 table 有一个 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 列中提取数据当然对性能不是很友好,因此我的查询很快变慢。
我想在一个查询中检索所有信息,但有一些事情阻止我这样做。
- 并非 table 中的每一行在 POSITIONMAP 中都有数据
- 有些行在 POSITIONMAP 中确实有数据,但它们只包含 2 个值(所以不是我要查找的第 3 个和第 4 个值。
- 我需要 table 中每一行的一行数据(使用上一个查询会导致重复的行
我得到的最接近的是:
select
id,
field1,
field2
t.*
FROM my_table v,
table (v.POSITIONMAP.sdo_ordinates) t
这为 my_table 中的每一行提供了 4 行。 一旦我尝试将 rownum 条件放入此查询中,我就会收到错误消息:"invalid user.table.column, table.column, or column specification"
有什么方法可以将我想做的事情合并到 1 个查询中吗?
一种方法是使用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 )
您可以按如下方式使用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