首页 > 解决方案 > 基于函数的空间索引的函数:如果 X 不为空且 Y 不为空(不能包含空格)

问题描述

我想创建一个基于函数的空间索引来加快空间查询。

create index workorder_idx on 
    workorder(mdsys.sdo_geometry(2001,26917,mdsys.sdo_point_type(x,y,null),null,null))
    indextype is mdsys.spatial_index;

基于函数的空间索引中的函数/表达式需要以特定方式构造,以便匹配记录可以存储在 USER_SDO_GEOM_METADATA 中。

2.8.2 COLUMN_NAME - USER_SDO_GEOM_METADATA

COLUMN_NAME 列包含 SDO_GEOMETRY 类型的列的名称。

列名以全部大写字符存储在空间元数据视图中。

当插入到 USER_SDO_GEOM_METADATA 视图中时,列名不能在带引号的字符串中包含空格或混合大小写字母,并且在查询中使用时不能在带引号的字符串中(除非它是全大写字符)。


由于列名不能包含空格,这意味着我的函数/表达式也不能包含空格。

这很好,除了我想处理 X 或 Y 为 null 的情况——我想在这种情况下返回 null,而不是mdsys.sdo_geometry()在有 null 时出错。


通常,我会用 case 语句来处理这个问题:

case when x is not null and y is not null then
    mdsys.sdo_geometry(2001,26917,mdsys.sdo_point_type(x,y,null),null,null)
end 

但是,case 语句中有空格。所以这行不通。

相反,我想做一些类似使用decode()函数的事情:

decode(x and y, not null, mdsys.sdo_geometry(2001,26917,mdsys.sdo_point_type(x,y,null),null,null))

但我不认为解码功能是这样工作的。无论如何,该表达式中有空格。


问题:

是否有可用于这种不包含空格的场景的开箱即用功能?

编辑:

事实证明,在 ArcGIS Desktop 10.7.1 中使用基于函数的空间索引时,无需向 ALL_SDO_GEOM_METADATA 添加记录。

标签: sqloraclefunctionindexingdecode

解决方案


如果将它们链接起来检查 x 后跟 y,则可以使用 decode。不确定它是否更优雅,但你在这里......

CREATE TABLE t(
 x number,
 y number
);

insert into t values (1, 2);
insert into t values (null, 2);
insert into t values (1, null);
insert into t values (null, null);
insert into t values (5, 10);

CREATE OR REPLACE FUNCTION geo_Ret RETURN varchar2 AS
BEGIN
   RETURN 'use function';
END geo_Ret;
/

SELECT DECODE(DECODE(x,null,null,1)+DECODE(y,null,null,1),2,geo_ret) from t;

第一次解码检查 x 并返回 1 或 null,第二次检查 y 并返回 1 或 null,第三次将两者相加,如果它们等于 2,则返回函数输出,否则返回 null。

输出:

use function
(null)
(null)
(null)
use function

编辑:如果您需要 x 和 y 值,请将解码默认输出更改为 x 而不是 1 和 y 而不是 2,并更改第三个解码以检查 null 而不是 2。


推荐阅读