Сложный порядок в SQL-запросах: возможно, с использованием CASE WHEN - PullRequest
4 голосов
/ 10 сентября 2010

У меня есть сложный алгоритм приоритезации, который я хочу написать в SQL при возврате страниц данных с приоритетами.

Некоторые из них имеют приоритет в соответствии с фиксированными значениями, другие упорядочены по значениям переменных. т.е.

// 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 подходящим инструментом для достижения этой цели? У кого-нибудь есть советы по работе с дополнительными уровнями сложности?

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 10 сентября 2010

Что-то вроде этого должно сделать это:

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 был столбцом NUMBER, что может быть не так. Суть в том, чтобы преобразовать все в строки, которые правильно упорядочены, используя маски соответствующего формата.

0 голосов
/ 10 сентября 2010

Сделав пару небольших предположений, похоже, это должно сработать:

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
...