2010-04-01 40 views
10

我想知道是否不建議在SQLite(或其他SQL引擎)中使用CASE語句來替換數據。例如讓我說我有一個查詢。SQLite是CASE語句很貴嗎?

SELECT Users, 
       CASE WHEN Active = 0 THEN 'Inactive' 
         WHEN Active = 1 THEN 'Active' 
         WHEN Active = 2 THEN 'Processing' 
         ELSE 'ERROR' END AS Active 
FROM UsersTable; 

什麼時候創建引用表並執行JOIN會更好?在這種情況下,我將使用ActiveID,ActiveDescription創建一個Table'ActiveStatesTable'並執行JOIN。

回答

11

CASE語句是首選語法:

  • 這是ANSI(92?),所以它支持MySQL和甲骨文,SQL服務器,Postgres的...不像具體的數據庫廠商IF語法
  • 支持一旦條件匹配
+2

應該考慮CASE語句的大小嗎?如果列表中有「描述ID」列,並且有100個描述要映射,該怎麼辦? – galford13x 2010-04-01 23:48:31

3

在做單獨的表,並加入肯定是寫這個代碼更清潔的方式,不進行評價的其餘部分 - 短ciruiting。例如,如果要使用相同的映射編寫另一個查詢,會發生什麼情況?您必須將CASE語句複製到新查詢中,並且複製副本不好。如果您需要添加新的活動狀態,會發生什麼情況?

從表現上看,JOIN和CASE都應該相當便宜。由於評估的短路和少數情況,CASE可能會稍微有點高性能,但在我看來,JOIN是更清晰,更靈活,更有效的解決方案。

+0

這是真的,但保持CASE不會太困難,因爲我可以創建一個具有CASE的VIEW,然後維護VIEW。 – galford13x 2010-04-01 23:42:19

3

CASE應該便宜得多,因爲它不應該涉及任何I/O,但對於小型表JOIN並不是那麼昂貴(但是測試它)。

問題是,如果您需要在多個查詢中維護此CASE,您是否需要在其上建立任何參照完整性?

+0

這是真的,但保持CASE不會太困難,因爲我可以創建一個具有CASE的VIEW,然後維護VIEW。 – galford13x 2010-04-01 23:43:06

+0

對於少數情況和例外情況可能很容易,但仍應該考慮。忽視完整性,將其維護在視圖中與在表中維護它不一樣(不能根據查詢更新翻譯)。 – Unreason 2010-04-02 00:05:13

+0

這很有道理。我將添加一個表格並執行一些基準。我完成後會發布結果。 – galford13x 2010-04-02 00:28:37