2011-03-03 102 views
2

我们试图执行select语句,该语句在case语句中使用列名称,并且如果在where子句中使用相同的列名称,它将进入无限循环。在where子句中执行Oracle查询

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子句子句中,而不是在

编辑:编辑查询

+2

SQL不会执行“无限循环”,所以在这里实际发生了什么?您缺少CASE表达式的END关键字,这意味着SQL将无法正常工作。 – 2011-03-03 09:29:28

+0

即使结束我也面临同样的问题 – Harish 2011-03-03 09:49:42

+0

什么让你觉得有一些无限循环?你如何运行查询?员工表有多大? – 2011-03-03 10:11:44

回答

4

显然还有别的事情上。 WHERE子句在SELECT(列表列表)子句之前被评估,它不可能产生无限循环。

考虑(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添加到您的CASE表达式,因为从一个情况下,所有的结果必须有相同的类型。没有to_char,就我而言,我获得了ORA-00932。当查询返回错误时,您的工具可能会挂起?

3

作为基于您提供的少量信息的一个非常疯狂的猜测,我会说如果没有WHERE子句查询正在执行全表扫描,但是当您添加WHERE子句时,它会切换到索引范围扫描。如果您感兴趣的六个部门的记录遍布整个表格,那么索引范围扫描很可能比表格扫描效率低得多。

这样做的一个可能原因是表和索引上的统计数据过时。

无论如何,诊断SQL性能问题时的第一步应该是查看执行计划。