SQL ORDER BY проблема - PullRequest
0 голосов
/ 02 мая 2009

Дубликат этого вопроса , который сам перекрестно ссылается на 3 других второстепенных варианта того же вопроса.


Привет всем,

Извините, но я ставлю свой вопрос как новый вопрос в этом посте. Мне сейчас очень нужна ваша помощь, и я очень ценю вашу помощь

SELECT *
    FROM (SELECT distinct gl.group_id,
                 gl.group_name,
                 gl.group_description,
                 gl.status_code,
                 gl.member_count,
                 (SELECT grpp.group_name
                      FROM test_group_relationship grel JOIN test_group grpp
                               ON grel.parent_group_id = grpp.group_id
                      WHERE grel.child_group_id = gl.group_id
                 ) AS parent_group_name,
                 gl.group_name_key,
                 gl.group_description_key
             FROM   test_group AS gl
             WHERE  gl.group_org_id   = '3909'
               AND (gl.group_name_key LIKE '%GROUP%')
         ) AS data_set 
    ORDER BY DECODE(:sort_key,
                      'name',            'constant',
                      'description',     group_description_key,
                      'memberCount',     LPAD(member_count, 4),
                      'status',          LPAD(status_code, 4),
                      'parentGroupName', parent_group_name
               )NULLS FIRST,
         UPPER(SUBSTR(group_name, 1, 1)),
         SUBSTR(group_name, 1, 1) DESC,
         UPPER(group_name),
         group_name DESC,
         group_name_key, 
         ;

Мой вопрос все еще остается схожим. Я хочу, чтобы динамическая сортировка проводилась на основе переменная: sort_key, которая каждый раз для сортировки имеет одну из различных опций декодирования.

Когда, sort_key: = 'name'. Как мы видим, оно вычисляется как константа, а затем оставшиеся столбцы в предложении ORDER BY.

Теперь, когда переменная sort_key: = 'description' или 'memberCount' .... каждое из значений, тогда логика ORDER BY LOGIC отличается для каждого из них.

Например, когда выбрано «описание», сортировка в ORDER BY cluase должна выполняться так же, как и для «имени».

Пример, подобный этому: -

 UPPER(SUBSTR(group_description, 1, 1)),
             SUBSTR(group_description, 1, 1) DESC,
             UPPER(group_description),
             group_description DESC,
             group_description_key, 

Вкратце, каждая из опций, которую получает переменная sort_key, логика ORDER BY различна, и я должен реализовать ее в том же SQL только сейчас.

Если это возможно при заказе CASE со всеми опциями, можете ли вы мне помочь. Мне нужна ваша очень помочь

1 Ответ

1 голос
/ 02 мая 2009

Если я вас правильно понимаю, вы спрашиваете, можно ли динамически изменять весь список ORDER BY на основе связанного параметра, включая варианты ASC / DESC и т. Д.

Лучше всего выполнять разные запросы с разными ORDER BY, в зависимости от того, как вы хотите сортировать. Это намного проще и будет работать быстрее.

Если вы действительно хотите сделать это так, как вы просите, вы можете сделать это в определенной степени, используя ту же технику, которую вы уже используете с ORDER BY DECODE (choice1, expression1, choice2, expression2, ...) за исключением того, что выражения должны были бы быть намного более сложными. Каждое выражение должно было бы создать объединенную строку полей фиксированного размера в порядке приоритета сортировки, например:

ORDER BY DECODE('description',     UPPER(SUBSTR(group_description, 1, 1))
                                || SUBSTR(group_description, 1, 1) 
                                || RPAD(UPPER(group_description),40)
                                || RPAD(group_description_key,10)

                ,'name',           UPPER(SUBSTR(group_name, 1, 1)),
                                || LPAD(1000-ASCII(group_name)), -- first char DESC
                                || RPAD(UPPER(group_name),20)
                                || RPAD(group_name_key,10)

Также было бы сложно смешивать поля ASC и DESC. Вы можете переключать направление для числовых полей, используя что-то вроде LPAD (1000000 - n, 7), где 1000000 - это число больше любого возможного n. Вы также можете сыграть некоторые другие трюки, как я делал в моем примере с первым символом group_name.

Этот метод не позволит базе данных использовать индексы для ускорения упорядочения (если вы не добавите несколько сумасшедших индексов на основе функций).

Опять же, я рекомендую вам отказаться от этого подхода и просто отправить в базу совершенно другой запрос в зависимости от вашего желаемого предложения ORDER BY. Если вы используете PL / SQL, вы также можете использовать динамический SQL для построения запроса с нужным предложением ORDER BY и его выполнения.

РЕДАКТИРОВАТЬ: Мой PL / SQL немного ржавый, но вот как вы можете сделать это в PL / SQL с динамическим SQL.

FUNCTION QueryGroups(sort_key in varchar2) RETURN REF CURSOR
IS
   sql_block VARCHAR2(2000);
   order_by VARCHAR2(2000);
   ret REF CURSOR;
BEGIN
   order_by :=
     CASE sort_key
       WHEN 'name'
         THEN  q'{UPPER(SUBSTR(group_name, 1, 1)),
                  SUBSTR(group_name, 1, 1) DESC,
                  UPPER(group_name),
                  group_name DESC,
                  group_name_key}';
       WHEN 'description'
         THEN  q'{UPPER(SUBSTR(group_description, 1, 1)),
                  SUBSTR(group_description, 1, 1) DESC,
                  UPPER(group_description),
                  group_description DESC,
                  group_description_key}';
     END CASE;

     sql_block = q'{SELECT *
                FROM (SELECT distinct gl.group_id,
                 gl.group_name,
                 gl.group_description,
                 gl.status_code,
                 gl.member_count,
                 (SELECT grpp.group_name
                      FROM test_group_relationship grel JOIN test_group grpp
                               ON grel.parent_group_id = grpp.group_id
                      WHERE grel.child_group_id = gl.group_id
                 ) AS parent_group_name,
                 gl.group_name_key,
                 gl.group_description_key
             FROM   test_group AS gl
             WHERE  gl.group_org_id   = '3909'
               AND (gl.group_name_key LIKE '%GROUP%')
         ) AS data_set }' || order_by;

     OPEN ret for sql_block;
     return ret;
END QueryGroups;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...