- Oracle 18c:*
我正在试验在查询中使用SDO_GEOMETRY顶点的不同技术。
例如,在列子查询中将坐标作为表使用:
with cte as (
select sdo_geometry(2002, 26917, null, sdo_elem_info_array(1, 2, 1), sdo_ordinate_array( 1, 2, 3, 4 )) shape from dual union all
select sdo_geometry(2002, 26917, null, sdo_elem_info_array(1, 2, 1), sdo_ordinate_array( 5, 6, 7, 8, 9,10 )) shape from dual union all
select sdo_geometry(2002, 26917, null, sdo_elem_info_array(1, 2, 1), sdo_ordinate_array(11,12, 13,14, 15,16, 17,18)) shape from dual)
select
(select
column_value
from
table((shape).sdo_ordinates)
where
rownum = 1 --Side note: "FETCH FIRST ROW ONLY" doesn't work the way I expected. It selects 1 for each startpoint X, which is incorrect. I'm not sure why it works that way.
) startpoint_x
from
cte
STARTPOINT_X
------------
1
5
11
字符串
该查询按预期工作。它获取每个几何体的起点X。
同样,我想知道是否可以使用相同的技术来获得每个几何体的起点Y。我将通过将rownum = 1
更改为rownum = 2
来从坐标列表中获得第二个坐标:
with cte as (
select sdo_geometry(2002, 26917, null, sdo_elem_info_array(1, 2, 1), sdo_ordinate_array( 1, 2, 3, 4 )) shape from dual union all
select sdo_geometry(2002, 26917, null, sdo_elem_info_array(1, 2, 1), sdo_ordinate_array( 5, 6, 7, 8, 9,10 )) shape from dual union all
select sdo_geometry(2002, 26917, null, sdo_elem_info_array(1, 2, 1), sdo_ordinate_array(11,12, 13,14, 15,16, 17,18)) shape from dual)
select
(select
column_value
from
table((shape).sdo_ordinates)
where
rownum = 2
) startpoint_y
from
cte
STARTPOINT_Y
------------
(null)
(null)
(null)
型
但这并不像我想象的那样。它返回null,而我希望它返回:
STARTPOINT_Y
------------
2
6
12
型
问题:
为什么这个查询对起点X rownum = 1
有效,而对起点Y rownum = 2
无效?
我知道还有其他方法可以与顶点交互,例如cross join table(sdo_util.getvertices(shape))
。这是可行的,但我想了解纵坐标在列子查询中如何作为表。
3条答案
按热度按时间slwdgvem1#
你可以使用一个函数:
字符串
或
CROSS JOIN LATERAL
(或CROSS APPLY
):型
这两个输出:
| START_POINT_Y |
| ------------ |
| 2 |
| 6 |
| 12 |
应该可以,但没有:
型
和/或
型
两者都应该工作,但输出:
| STARTPOINT_Y |
| ------------ |
| 2 |
| 2 |
| 2 |
pkbketx92#
你确实得到了问题的帮助,最好是摆脱这里的rownum-filter,但我猜你仍然错过了答案,为什么rownum = 1完成了这项工作,而rownum = 2没有。
请注意:在Oracle中,你永远不能要求rownum = 2或类似rownum > 2的值。很久以前我读过一个关于这个问题的解释,我不能再给予你解释了,但据我所知,这与“rownum”的求值时间有关。如果你不想让rownum = 1并过滤掉它,那么你永远不会有rownum = 2,这是我脑海中的缩写形式。
如果你将来真的需要处理类似的东西,你可以使用row_number()函数。
tf7tbtn23#
下面是@MTO的第二个查询的通用版本。它将 * 所有 * 坐标作为行,而不仅仅是
startpoint_y
:或横向交叉接合(或横向应用):
个字符