2011-03-03 98 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性能問題時的第一步應該是查看執行計劃。