我们正在尝试执行一个select语句,该查询在case语句中使用列名,如果在where子句中使用相同的列名,它将进入无限循环。
例如
select empId,empName,
(case when empDept in ('A','B','C') then empAge
when empDept in ('E','F','G') then empExp
else 'Dept-Not found' end)
from employee where empDept in ('A','B','C','D','E','F','G')
即使我们在where子句而不是in中放入或子句也没关系。
编辑:编辑了查询
答案 0 :(得分:4)
考虑(10.2.0.1):
SQL> CREATE TABLE employee AS
2 SELECT 1 empId, 'e1' empName, 1 empAge, 10 empExp, 'A' empDept FROM dual
3 UNION ALL SELECT 2, 'e2', 2, 9, 'B' FROM dual
4 UNION ALL SELECT 3, 'e3', 3, 8, 'C' FROM dual
5 UNION ALL SELECT 4, 'e4', 4, 7, 'D' FROM dual
6 UNION ALL SELECT 5, 'e5', 5, 6, 'E' FROM dual
7 UNION ALL SELECT 6, 'e6', 6, 5, 'F' FROM dual;
Table created
SQL> select empId,empName,
2 (case when empDept in ('A','B','C') then to_char(empAge)
3 when empDept in ('E','F','G') then to_char(empExp)
4 else 'Dept-Not found' end)
5 from employee where empDept in ('A','B','C','D','E','F','G');
EMPID EMPNAME (CASEWHENEMPDEPTIN('A','B','C'
---------- ------- ----------------------------------------
1 e1 1
2 e2 2
3 e3 3
4 e4 Dept-Not found
5 e5 6
6 e6 5
正如您在我的示例中所看到的,我必须在您的案例表达式中添加to_char
,因为案例的所有结果必须具有相同的类型。没有to_char
,在我的情况下,我获得了ORA-00932。当查询返回错误时,您的工具可能会挂起吗?
答案 1 :(得分:3)
基于您给出的少量信息,我会说,如果没有WHERE子句,查询正在进行全表扫描,但是当您添加WHERE子句时,它会切换到索引范围扫描。如果您感兴趣的六个部门的记录遍布整个表格,那么索引范围扫描很可能比表格扫描效率低得多。
一个可能的原因是表和索引的统计信息是陈旧的。
在任何情况下,诊断SQL性能问题的第一步应该是查看执行计划。