PLSQL: нужна помощь, чтобы понять инструкции CASE в ORDER BY - PullRequest
1 голос
/ 01 апреля 2011

У меня есть фрагмент кода, в котором есть ORDER BY с регистром в нем:

                        ORDER BY
                        (
                            CASE
                                WHEN r.id BETWEEN 900 AND 999 THEN '1AAAAA'
                                ELSE '2'
                                    || upper(id.name)
                            END) ASC,
                        r.date DESC ;

Может кто-нибудь объяснить:

  1. что означает «1AAAAA'и' 2 '?
  2. что означает

    ||верхний (id.name)

Ответы [ 4 ]

3 голосов
/ 01 апреля 2011

Выражение case оценивается как значение

CASE
  WHEN r.id BETWEEN 900 AND 999 THEN '1AAAAA'
  ELSE '2'
    || upper(id.name)
END

Весь вышеприведенный блок кода с оценкой «1AAAAA» или «2 [value-of-r.id]» в зависимости от значения r.id.

Как указано в предложении order by, это значение будет использоваться для сортировки результатов следующим образом:

  1. первый список всех записей, где r.id находится между 900 и 999
  2. затем перечислите все остальные записи в порядке возрастания r.id (|| - оператор объединения строк).
3 голосов
/ 01 апреля 2011

В PL / SQL || является оператором объединения .

Как именно происходит упорядочение, зависит от остальной части запроса, но похоже, что он помещает записи с r.id BETWEEN 900 AND 999 перед другими записями, которые отсортированы по id.name.

1 голос
/ 01 апреля 2011

Вот некоторые данные. Как вы можете видеть, сортировка имени происходит в порядке ASCII, который не совсем совпадает с алфавитным порядком:

SQL> select id, name, somedate
  2  from t42
  3  order by name, somedate
  4  /

        ID NAME       SOMEDATE
---------- ---------- ---------
         8 Billington 24-MAR-11
        13 Cave       19-MAR-11
         4 Clarke     28-MAR-11
       919 Feuerstein 13-MAR-11
        16 Gasparotto 16-MAR-11
      1014 KULASH     18-MAR-11
         1 Kestelyn   31-MAR-11
       917 Kishore    15-MAR-11
         2 Lira       30-MAR-11
         6 PADFIELD   26-MAR-11
        11 Rigby      21-MAR-11
      1007 Robertson  25-MAR-11
        12 SCHNEIDER  20-MAR-11
         9 SPENCER    23-MAR-11
         3 TRICHLER   29-MAR-11
       918 VERREYNNE  14-MAR-11
        10 boehmer    22-MAR-11
        15 hall       17-MAR-11
       920 poder      12-MAR-11
         5 van wijk   27-MAR-11
      1021            11-MAR-11

21 rows selected.

SQL>

Сортировка по upper(name) делает его нечувствительным к регистру:

SQL> select id, name, somedate
  2  from t42
  3  order by upper(name), somedate
  4  /

        ID NAME       SOMEDATE
---------- ---------- ---------
         8 Billington 24-MAR-11
        10 boehmer    22-MAR-11
        13 Cave       19-MAR-11
         4 Clarke     28-MAR-11
       919 Feuerstein 13-MAR-11
        16 Gasparotto 16-MAR-11
        15 hall       17-MAR-11
         1 Kestelyn   31-MAR-11
       917 Kishore    15-MAR-11
      1014 KULASH     18-MAR-11
         2 Lira       30-MAR-11
         6 PADFIELD   26-MAR-11
       920 poder      12-MAR-11
        11 Rigby      21-MAR-11
      1007 Robertson  25-MAR-11
        12 SCHNEIDER  20-MAR-11
         9 SPENCER    23-MAR-11
         3 TRICHLER   29-MAR-11
         5 van wijk   27-MAR-11
       918 VERREYNNE  14-MAR-11
      1021            11-MAR-11

21 rows selected.

SQL>

CASE() меняет это далее, группируя сначала все записи в указанном диапазоне идентификаторов, а затем все остальные записи. Записи в выбранном диапазоне просто сортируются по ДАТЕ, тогда как другие записи по-прежнему сортируются по имени и дате:

SQL> select id, name, somedate
  2  from t42
  3          ORDER BY
  4          (
  5              CASE
  6                  WHEN id BETWEEN 900 AND 999 THEN '1AAAAA'
  7                  ELSE '2'
  8                      || upper(name)
  9              END) ASC,
 10          somedate DESC
 11  /

        ID NAME       SOMEDATE
---------- ---------- ---------
       917 Kishore    15-MAR-11
       918 VERREYNNE  14-MAR-11
       919 Feuerstein 13-MAR-11
       920 poder      12-MAR-11
      1021            11-MAR-11
         8 Billington 24-MAR-11
        10 boehmer    22-MAR-11
        13 Cave       19-MAR-11
         4 Clarke     28-MAR-11
        16 Gasparotto 16-MAR-11
        15 hall       17-MAR-11
         1 Kestelyn   31-MAR-11
      1014 KULASH     18-MAR-11
         2 Lira       30-MAR-11
         6 PADFIELD   26-MAR-11
        11 Rigby      21-MAR-11
      1007 Robertson  25-MAR-11
        12 SCHNEIDER  20-MAR-11
         9 SPENCER    23-MAR-11
         3 TRICHLER   29-MAR-11
         5 van wijk   27-MAR-11

21 rows selected.

SQL>
0 голосов
/ 03 апреля 2011
1. Что означают «1ААААА» и «2»?

Это буквальные константы.

2. в чем смысл || верхняя (id.name)

|| - стандартный оператор конкатенации SQL. 'A' || «B» производит «AB».

ИМХО, ваш вопрос в том, что означает весь order by case, так что, пошлите шаг за шагом:

             ORDER BY
                    (
                        CASE
                            WHEN r.id BETWEEN 900 AND 999 THEN '1AAAAA'
                            ELSE '2'
                                || upper(id.name)
                        END) ASC,
                    r.date DESC ;

Это упорядочит ваш результирующий набор по результату вычисления выражения регистра (по возрастанию), затем по r.date (потомок).

Дело просто вернет '1AAAAA' для любого идентификатора от 900 до 999 (это будет заказано r.date, помните? '

Для любого другого значения он объединяет 2 перед id.name.

Это гарантирует, что любая запись с идентификатором от 900 до 999 появится в первой «группе», которая упорядочена по дате, по убыванию. Затем вторая группа будет содержать все остальные записи, упорядоченные по верхнему имени, а затем по дате.

Возможно, вы захотите увидеть эти данные, чтобы понять, как это работает ... просто добавьте выражение case к вашему оператору select в качестве нового столбца.

Например, если ваш запрос начинается так:

SELECT r.id, id.name
  FROM

добавить кейс, например, так:

SELECT r.id, id.name
       , 
       CASE
         WHEN r.id BETWEEN 900 AND 999 THEN '1AAAAA'
         ELSE '2'|| upper(id.name)
       END ORDER_CRITERIA
  FROM

Это поможет вам понять, что происходит с этим выражением, поскольку вы увидите произведенные данные в качестве последнего столбца вашего запроса.

...