我想从sdo几何表中选择x,y值。gtype是2001,所以它们是点。sdo几何体列名为几何体。
我试过:
select geometry.sdo_point.x, geometry.sdo_point.y from el_pole_test
这将返回null值。
我也尝试过通过索引:
select p.geometry.SDO_ORDINATES[0] as point_x, p.geometry.SDO_ORDINATES[1] as point_y from el_pole_test
这是错误的。
如果我在集合内部查看给定的点,我会看到这样的数组:
1661473.42619016
2630277.19731551
1
0
数组中的前两个值是x和y。我不确定1和0扮演什么角色。
表创建:
create table EL_POLE_TEST
(
entity_id VARCHAR2(39) not null,
geometry MDSYS.SDO_GEOMETRY
)
示例行:
INSERT INTO el_pole_test
VALUES ('00001D212',
mdsys.Sdo_geometry(2001, NULL, NULL,
mdsys.Sdo_elem_info_array(1, 1, 1, 3, 1, 0),
mdsys.Sdo_ordinate_array(1661473.42619016, 2630277.19731551, 1, 0)));
INSERT INTO el_pole_test
VALUES ('00000D212',
mdsys.Sdo_geometry(2001, NULL, NULL,
mdsys.Sdo_elem_info_array(1, 1, 1, 3, 1, 0),
mdsys.Sdo_ordinate_array(1667630.11795338, 2640351.11795338, 1, 0)));
您需要惊人的大量SQL技巧才能从该表中获得X和Y坐标:通过交叉连接TABLE
运算符来运行集合元素(但您必须使用表别名-这是唯一需要别名的时候(,使用分析函数为每个ENTITY_ID排序元素,然后使用MAX/CASE聚合结果,每行得到一个X和一个Y:
select
entity_id,
max(case when rownumber = 1 then column_value else null end) x,
max(case when rownumber = 2 then column_value else null end) y
from
(
select
entity_id,
column_value,
row_number() over (partition by entity_id order by rownum) rownumber
from el_pole_test e
cross join table(e.geometry.sdo_ordinates)
)
group by entity_id;
ENTITY_ID X Y
--------- ---------------- ----------------
00000D212 1667630.11795338 2640351.11795338
00001D212 1661473.42619016 2630277.19731551