2012-06-14 154 views
0

這是一個簡單最安全/優化的代碼「不記錄存在」的問題:最乾淨的方式來確定是否存在一行?

. . . // "oc" is an OracleConnection component 
const string sql = "SELECT COUNT(*) FROM CONGRESS WHERE IQ > WEIGHT"; //Most politicians have more pounds than sense 
try { 
    using (OracleCommand ocmd = new OracleCommand(sql, oc)) { 
     return Convert.ToInt32(ocmd.ExecuteScalar()) > 0; 
    } 
. . . // the rest elided to spare the vertical scroll-bar bearings 

+0

對我來說看起來不錯 –

回答

3

喜歡的東西

SELECT 1 
    FROM dual 
WHERE EXISTS(SELECT 1 
       FROM congress 
       WHERE iq > weight) 

可能是最安全的選擇,因爲它允許甲骨文儘快停止執行的查詢作爲一個找到匹配的行,而不是全表掃描,以獲得精確的計數。類似於

SELECT COUNT(*) 
    FROM congress 
WHERE iq > weight 
    AND rownum <= 1 

也應該做同樣的事情。在我看來,第一個查詢是更加表達你的意圖,但它也有點冗長。

+0

那麼如果記錄不存在會返回什麼?應該在ExecuteScalar或ExecuteReader下運行嗎? – saluce

+0

第一個查詢將返回1或一個空的結果集。第二行將返回一個結果集 - 單個行 - 或者是0或1.你可以使用ExecuteScalar或ExecuteReader來查詢,儘管'ExecuteScalar'可能更容易。 –

相關問題