sql - 基于函数的空间索引的函数:如果 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))
但我不认为解码功能是这样工作的。无论如何,该表达式中有空格。
问题:
是否有可用于这种不包含空格的场景的开箱即用功能?
- 我更愿意使用 OOB Oracle 函数来执行此操作,而不是创建自定义函数,因为我没有 CREATE FUNCTION 权限。
- 数据库版本是 Oracle 18c。
编辑:
事实证明,在 ArcGIS Desktop 10.7.1 中使用基于函数的空间索引时,无需向 ALL_SDO_GEOM_METADATA 添加记录。
解决方案
如果将它们链接起来检查 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。
推荐阅读
- vba - 如何为邮件获取或分配颜色类别?
- macos - 在 AppleScript 中识别终端窗口
- node.js - 如何在 docker 中从一个容器获取数据到另一个容器?我收到 ECONNREFUSED 错误
- php - 在现场 php 文件不工作它显示内部服务器错误
- laravel-5.4 - SQLSTATE [HY000]:一般错误:1364 字段“requisition_id”没有默认值
- c# - 在 .NET Framework 中使用 MathNet.Numerics.LinearAlgebra 进行矩阵连接
- wordpress - 如何自动填充 WooCommerce 结帐地址框
- session - 是否可以增加 mvc 中的特殊会话超时?
- python - How to do an 'insert' into a nonzero position in an empty list?
- python - ImportError:没有名为 skimage.io 的模块