2012-04-14 61 views
0

我想出了以下查詢:放置在那裏的條件

SELECT ROOMNO,BUILDINGNO 
FROM MRM_ROOM_DETAILS 
WHERE ROOMID IN (
    SELECT distinct roomid 
    FROM MRM_BOOKING_DETAILS 
    WHERE (CHECKIN NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00') 
    AND (CHECKOUT NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00')) 
AND CAPACITY > 15 
AND PROJECTIONSTATUS = 'NO'; 

我需要放置在方法SQLiteDatabase.query(此查詢),並相應地獲取行。我無法理解如何在條件(也包含子查詢)的位置放置這個大的字符串來代替「字符串選擇」,即該方法的第3個參數。我應該簡單地將第三個參數中的整個部分(包括子查詢)作爲字符串寫入,否則還有其他更好的方法可以做到這一點嗎?

請給我建議最好的方法來做同樣的事情。

問候,

回答

1

我肯定會使用rawQuery,而不是查詢。這裏重要的是你使用selectionArgs參數來防止注入。

string sql = "SELECT ROOMNO,BUILDINGNO 
FROM MRM_ROOM_DETAILS 
WHERE ROOMID IN (
    SELECT distinct roomid 
    FROM MRM_BOOKING_DETAILS 
    WHERE (CHECKIN NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00') 
    AND (CHECKOUT NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00')) 
AND CAPACITY > 15 
AND PROJECTIONSTATUS = 'NO';"; 
db.rawQuery(sql, null); // <---- here null would be replaced with your 
         // parameters in order to prevent injection 
0

是的,你只需提供完整的 「WHERE條件」(不包括 「WHERE」,包括逐字子查詢)作爲selection參數SqliteDatabase.query()。

你需要擔心的是性能。您事先並不知道您的數據庫設備上會遇到哪種SQLite版本,並且子查詢有時會表現得相當糟糕,尤其是在與LIMIT子句結合使用時。

確保在多個設備上測試此查詢(除非受影響的行數不重要)。您可以通過將其分成多個報表來獲得一些業績,首先簡單地檢索預訂詳情,獲取房間詳情。

+0

請注意sixfeetsix關於使用選擇參數的評論。除非你確定你的論點已被消毒,否則注射是需要考慮的。 – 2012-04-14 11:43:02