2009-11-17 26 views
0

我有一個查詢,我需要修改選定的數據,我想限制我的結果的數據。例如:Codeigniter WHERE「AS」字段

SELECT table_id,弧度(25)AS rad FROM test_table WHERE rad < 5 ORDER BY rad ASC;

這裏掛起的是'rad < 5',因爲根據codeigniter沒有'rad'列。我試過把它寫成一個自定義查詢($ this-> db-> query(...)),但即使這樣也不會讓我。我需要根據這個字段來限制我的結果。哦,如果我刪除了WHERE過濾器,那麼ORDER BY就可以完美工作。結果是rad場的順序ASC。

幫助!!!

回答

0

與衆多的DBMS,我們需要重複where子句中的公式/表達式,即

SELECT table_id, radians(25) AS rad 
FROM test_table 
WHERE radians(25) < 5 
ORDER BY radians(25) ASC 

然而,在這種情況下,由於計算列是一個常數,查詢本身並不能使很有道理。是否可能缺少一部分,如弧度(25 * myColumn)或類似的東西?

編輯
你似乎很失望(約配方等的真實性質以下信息),因爲該公式需要重複......上幾點意見:

的事實,公式需要明確拼寫而不是別名可能會使查詢更不可讀,寫作樂趣更少等(下文詳述),但更重要的因素要考慮是在WHERE中使用的公式子句會導致DBMS爲潛在的所有記錄計算此值躺在桌子上!

這輪流傷害性能在幾個方面:

  • SQL可能不能夠使用的一些索引,而不是必須掃描表(或其部分)
  • 如果公式是沉重的,它無論是響應速度慢和少一個可擴展的服務器

的情況不是很糟糕,如果在附加謂詞的WHERE子句允許SQL過濾掉,使[的顯著量]記錄了WO否則將被處理。這些額外的搜索標準可能由應用程序驅動(例如,除輻射外的此條件,位置的[不相關]高度要求低於6000英尺)之外,或者可以「人爲」添加此類標準以幫助該查詢(例如,您可能知道一個粗略的啓發式算法,該算法不足以在可接受的精度內計算「弧度」值,但可能還不足以過濾70%的記錄,只保留這些有可能。對於滿足公式本身所需的「弧度」

現在一些技巧的確切範圍,企圖使其更快:

  • 記住,你可能並不需要ŧ Ø運行100%的教科書公式。
    我不確定大圓圈數學的哪一部分與這個弧度計算有關,但用通用術語來說,一些公式包含一個昂貴的步驟,例如平方根提取,對三角函數的調用等。在某些情況下,可以通過將步驟應用於謂詞的另一側(通常只需要評估一次)來簡化公式(其必須針對多個記錄/值運行)。例如,如果說搜索條件謂詞是"WHERE SQRT((x1-x2)^2 + (y1-y2)^2) > 5"。由於距離的計算涉及找到平方根的平方根,所以可以決定去除平方根,而是將該修改後的公式的結果與距離值的平方作比較,即"WHERE ((x1-x2)^2 + (y1-y2)^2) > (5^2)"
  • 根據您的SQL/DBMS系統,可以在自定義函數中實現該公式,這將使其更有效(因爲「預編譯」,可能是用更好的語言編寫的),並且更短在SQL查詢本身中引用(事件雖然需要被列爲兩次,如上所述)
  • 根據情況,還可能更改數據庫模式和基礎應用程序,使公式(或其部分) ),但預先計算和索引,保存DBMS這個冗長的決議基於函數的謂詞。
+0

25的值是動態的,我想這將是答案,不幸的是不是我正在尋找的那個。我使用的實際表達是「大圓圈」。所以這是一個相當大的計算/表達。謝謝。 – phxis 2009-11-17 15:36:45

+0

@phxis:查看有關在where子句中使用公式的問題的附加信息,以及抵消此責任的方法。 – mjv 2009-11-17 16:34:08