【发布时间】:2015-05-15 11:07:37
【问题描述】:
我在使用不同的正确查询更改 PL/SQL oracle 中的查询时遇到问题。当前查询:
SELECT MAX (workzone)
FROM sccd_device_uim_tab
WHERE NAME LIKE 18075009 || '%';
我的客户需要修改查询,因为:
Full table with a % should definitely be avoided.
这个问题有什么解决办法?
提前致谢
从包中添加查询
PROCEDURE sccd_get_impactservice_manual (
in_faultid IN VARCHAR2,
in_deviceid IN VARCHAR2,
in_status IN VARCHAR2,
in_opendate IN DATE,
in_closedate IN DATE,
out_impact_result OUT tcur,
out_count_service OUT NUMBER,
out_workzone OUT VARCHAR2,
p_ret_char OUT VARCHAR2,
p_ret_number OUT NUMBER,
p_ret_msg OUT VARCHAR2
)
IS
BEGIN
SELECT orauser.ossa_get_sto_from_device (in_deviceid)
INTO out_workzone
FROM DUAL;
IF out_workzone IS NULL
THEN
SELECT MAX (workzone)
INTO out_workzone
FROM sccd_device_uim_tab
WHERE NAME = in_deviceid; --//this is I try to solve
--WHERE NAME LIKE in_deviceid || '%'; //this is the current issue
END IF;
【问题讨论】:
-
您需要提供更多详细信息。 NAME 列的数据类型是什么?似乎是一个 varchar2,但你正在将它与一个数字进行比较。所以,解释一下。当您说正在进行全表扫描时,请发布执行计划。是否涉及任何索引?如果它是一个 NUMBER 列,那么使用 LIKE 是没有意义的。您正在强制进行隐式数据类型转换。对于数字,请使用 RANGE 比较,而不是 LIKE。
-
感谢您回答我的问题,为什么我们使用 like 因为 18075009 的类型不是数字,它也是 varchar2 和列名称。
-
你得到什么错误信息?
-
我很惊讶,它以前如何使用
WHERE NAME LIKE 18075009 || '%';是一个语法错误 -
WHERE NAME LIKE in_deviceid || '%'如果列上有索引,您应该看到索引扫描而不是全表扫描。看我的回答。
标签: sql oracle indexing sql-like full-table-scan