2010-09-10 76 views
4

我有一個複雜的優先級排序算法,我希望在SQL中寫入以返回優先級排序的數據頁面時。SQL查詢中的複雜排序:可能使用CASE WHERE

其中一些按照固定值排列優先級,另一些按變量值排序。即

// Initial sort on ATTR1 (value1/value2 is higher than value3) 
if ATTR1 = value1 or value2 
    then orderBy creationDate, then modifiedDate, then author 
else if ATTR1 = value3 
    then 
    // if ATTR1 = value3, do secondary sort on ATTR2 (value4 is higher than value5) 
    if ATTR2 = value4 
     then orderBy oldPriority, then modifiedDate, then creationDate, then author 
    if ATTR2 = value5 
     then orderBy creationDate, then modifiedDate 

我曾看過SQL CASE WHEN,但不知道如何使第二級屬性比較的工作。

CASE WHEN是一個合適的工具嗎?有沒有人有任何提示處理額外的複雜程度?

預先感謝您!

+0

我不知道這是有道理的:如果有隻有2行和一個具有ATTR1 =值和其他有ATTR1 =值3和ATTR2 = value4,應該先排序? – 2010-09-10 11:14:18

+0

我在原來的問題中加入了一些評論:) – laura 2010-09-10 11:25:10

+0

道歉,很快就發送了一個。行應首先由ATTR1優先(按照此次序value1,value2,value3) - 因此在您的示例中,ATTR1 = value1將首先出現。然後如果ATTR1 =值3,繼續做第二類 – laura 2010-09-10 11:28:05

回答

4

像這樣的東西應該這樣做:

ORDER BY attr1, 
CASE WHEN ATTR1 IN (value1, value2) 
     THEN TO_CHAR(creationDate,'YYYYMMDDHH24MISS') 
      || to_char(modifiedDate,'YYYYMMDDHH24MISS') || author 
    WHEN ATTR1 = value3 
     THEN attr2 || CASE WHEN ATTR2 = value4 
          THEN to_char(oldPriority,'99999') 
           || to_char(modifiedDate,'YYYYMMDDHH24MISS') 
           || to_char(creationDate,'YYYYMMDDHH24MISS') 
           || author 
          WHEN ATTR2 = value5 
          THEN to_char(creationDate,'YYYYMMDDHH24MISS') 
           || to_char(modifiedDate,'YYYYMMDDHH24MISS') 
          END 
    END 

我認爲oldPriority是一個數字列,這可能並非如此。重點是將所有內容都轉換爲正確排序的字符串,並使用適當的格式掩碼。

+0

謝謝你的回覆。 ||是什麼?做?? – laura 2010-09-10 12:44:35

+0

||是字符串連接運算符,即'a'|| 'b'是'ab' – 2010-09-10 13:08:18

+0

啊,太棒了!非常感謝! – laura 2010-09-10 13:16:39

0

製作了幾個小的假設,看來這應該工作:

order by 
    case ATTR1 
     when value1 then 
     1 
     when value2 then 
     2 
     when value3 then 
     3 
    end, 
     when ATTR1 in (value1,value2) 
      or (ATTR1 = value3 and ATTR2 = value5) then 
     creationDate 
     else 
     null 
     end, 
    case 
     when ATTR1 = value3 and ATTR2 = value4 then 
     oldPriority 
     else 
     null 
     end, 
    modifiedDate, 
    case 
     when not (ATTR1 = value3 and ATTR2 = value5) then 
      author 
     else null 
     end