2016-02-25 65 views
2

我有以下查詢:簡化多個重複的情況下表達和「在哪裏」

SELECT CASE 
    WHEN @from < item.UpdatedOnCurr AND item.UpdatedOnCurr <= @till AND @till < item.UpdatedOnNext 
     THEN item.Id 
    ELSE '00000000-0000-0000-0000-000000000000' 
     END AS Id, 
     CASE 
      WHEN @from < item.UpdatedOnCurr AND item.UpdatedOnCurr <= @till AND @till < item.UpdatedOnNext 
      THEN item.PreviousId 
      ELSE item.Id 
     END AS PreviousId, 
     item.UUID, 
     CASE 
      WHEN @from < item.UpdatedOnCurr AND item.UpdatedOnCurr <= @till AND @till < item.UpdatedOnNext 
      THEN item.Json 
      ELSE NULL 
     END AS Json, 
     item.TableName, 
     item.PermissionId, 
     item.UpdatedOnCurr 

FROM Computed item 
WHERE item.Json IS NOT NULL AND (
     (@from < item.UpdatedOnCurr AND item.UpdatedOnCurr <= @till AND @till < item.UpdatedOnNext) 
    OR (item.UpdatedOnCurr <= @from AND @from < item.UpdatedOnNext AND item.UpdatedOnNext <= @till) 
); 

而且我想簡化它,即所有那些多個CASE表達式切割我的眼球了,所以我想重用@from < item.UpdatedOnCurr AND item.UpdatedOnCurr <= @till AND @till < item.UpdatedOnNext檢查,以便它不會執行多次每個選定的行...

那麼你如何實現這一目標?

+0

放入熱膨脹係數,計算的情況下,一旦謂詞和過濾CTE內,使用簡單的情況下,在外部查詢 –

+0

你可以寫一個函數,只是調用 – AntDC

+0

這是CASE表達式! (不是情況說明...) – jarlh

回答

1

With APPLY你可以清理一些重複的邏輯。 CASE仍然存在..但我發現它更具可讀性。

SELECT CASE m.m 
      WHEN 1 
      THEN item.Id 
      ELSE '00000000-0000-0000-0000-000000000000' 
     END AS Id, 
     CASE m.m 
      WHEN 1 
      THEN item.PreviousId 
      ELSE item.Id 
     END AS PreviousId, 
     item.UUID, 
     CASE m.m 
      WHEN 1 
      THEN item.Json 
      ELSE NULL 
     END AS Json, 
     item.TableName, 
     item.PermissionId, 
     item.UpdatedOnCurr 

FROM Computed item 
CROSS APPLY (
    select 
     CASE 
      WHEN @from < item.UpdatedOnCurr AND item.UpdatedOnCurr <= @till AND @till < item.UpdatedOnNext 
      THEN 1 
      ELSE 0 
     END m 
) m 
WHERE item.Json IS NOT NULL AND (
     (@from < item.UpdatedOnCurr AND item.UpdatedOnCurr <= @till AND @till < item.UpdatedOnNext) 
    OR (item.UpdatedOnCurr <= @from AND @from < item.UpdatedOnNext AND item.UpdatedOnNext <= @till) 
); 
相關問題