ЗАКАЗАТЬ ДЕКОДОМ (BLAH, [КОЛОННЫЙ НОМЕР]) для запроса в один столбец. Как это работает? - PullRequest
12 голосов
/ 19 февраля 2010

Привет, мне нужна помощь, чтобы понять часть запроса, которая будет выглядеть примерно так:

SELECT ax.animal_code    
FROM  raw_animal_xref ax,
      animal_xref_type axt
WHERE ax.animal_mnemonic = l_animal_mnemonic -- Example 'COUGAR'
AND   ax.animal_code_type = axt.animal_code_type
ORDER BY DECODE (animal_type, 
                l_type_to_be_matched, -1, -- Example 'CATS'
                l_current_type, 0, -- Example 'BIG CATS'
                nvl(axt.type_search_priority, 100)) ASC; -- EXAMPLE 'Big Cats' Priority is 1

Поскольку этот запрос возвращает только 1 запрос, я немного озадачен тем, как ORDER BY работает с различными несуществующими номерами столбцов, предоставленными DECODE. Запрос работает как курсор, чтобы найти уникальный код для рассматриваемого животного, учитывая мнемонику животного текущий тип животного и тип, с которым нужно сопоставить.

Я думаю, что DECODE возвращает разные номера столбцов в ORDER BY, и я попытался поэкспериментировать с другими простыми выборками из одного столбца в некоторых других таблицах с ORDER по '-1', '0' и '100' и ORDER by, кажется, не работает для 0 и 100. Почему он работает с -1 или любым другим числом?

Надеюсь, кто-нибудь сможет мне это объяснить. Спасибо!

Ответы [ 3 ]

5 голосов
/ 19 февраля 2010

ORDER BY может использовать одно из трех выражений. Во-первых, псевдоним списка выбора, во-вторых номер столбца в списке выбора или, в-третьих, выражение SQL, которое может использовать ноль или более столбцов из исходных таблиц.

Так что когда вы используете ЗАКАЗАТЬ ПО SUBSTR (col, 2,10) Вы заказываете по 10-символьной подстроке значения столбца, начиная со второго символа.

Аналогично при использовании

ORDER BY decode(col,'DOG',1,'CAT',2,'EEL', 3, 5)

вы переводите 'CAT' в значение 1, DOG в значение 2 и EEL в значение 3, затем упорядочиваете по результирующему числовому значению (т.е. сначала DOG, затем CAT, затем EEL, наконец что-нибудь еще). *

Вы можете добиться того же порядка, используя

ORDER BY decode(col,'DOG','A','CAT','B','EEL', 'C', 'D')
4 голосов
/ 19 февраля 2010

Создает набор, который будет использоваться для оформления заказа.

Если animal_type = l_type_to_be_matched, использовать -1 в качестве значения сортировки для этой строки
иначе, если animal_type = l_current_type, использовать 0 в качестве значения сортировки этой строки
иначе, если axt.type_search_priority равен нулю, тогда используйте 100 в качестве значения сортировки этой строки
иначе используйте axt.type_search_priority в качестве значения сортировки для этой строки.

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

1 голос
/ 23 февраля 2010

Обращаясь к этой части вашего вопроса:

Я думаю, что DECODE возвращает разные номера столбцов в ORDER BY с, и я попытался поэкспериментировать с другим простым выбором одного столбца в некоторых других таблицахс ORDER на '-1', '0' и '100' и ORDER by, похоже, не работает для 0 и 100. Почему он работает с -1 или любым другим числом?

Ваша путаница понятна;но нет, значения, возвращаемые DECODE, не интерпретируются как номера столбцов.

Oracle поддерживает небольшой синтаксический ярлык, в котором столбцы результирующего набора могут ссылаться позиционно в предложении ORDER BY.Например, это:

SELECT a, b FROM some_table ORDER BY 1,2

- это то же самое, что и:

SELECT a, b FROM some_table ORDER BY a,b

Однако эта позиционная запись может быть сделана только с неотрицательными целочисленными литералами.Если ORDER BY включает в себя выражение, которое создает числовое значение, оно будет интерпретироваться не как номер столбца, а как фактическое значение, по которому нужно отсортировать.Кроме того, отрицательные числовые литералы интерпретируются как значения сортировки, а не как номера столбцов.

SELECT * FROM table ORDER BY -1 будет сортировать все строки по постоянному значению -1 (фактически без сортировки).

SELECT * FROM table ORDER BY 0вернет ошибку, потому что 0 - недопустимый номер столбца.

SELECT * FROM table ORDER BY 1 отсортирует все строки по значению первого столбца в таблице.

SELECT * FROM table ORDER BY 100 отсортирует все строки назначение 100-го столбца в таблице или вернуть ошибку, если столбцов меньше 100.

SELECT * FROM table ORDER BY TO_NUMBER('1') отсортирует все строки по постоянному значению 1.

У меня нет 'Я тщательно проверил это, но, глядя на некоторые планы выполнения, кажется, что вы можете даже указать нецелочисленный числовой литерал, и он будет округлен и использован в качестве номера столбца.

SELECT * FROM table ORDER BY 1.5отсортировать по значению первого столбца.

...