ORDER BY DECODE (BLAH, [COLUMN NUMBER]) в одном запросе столбца. Как это работает?

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

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, похоже, не работает для 0 и 100. Почему он работает с -1 или любым другим числом?

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

ORDER BY decode(col,'DOG','A','CAT','B','EEL', 'C', 'D')

Ответ 3

Ссылаясь на эту часть вашего вопроса:

Я думаю, что DECODE возвращает разные номера столбцов для ORDER BY и я попытался экспериментировать с различные простые одиночные столбцы выбирают на некоторых других таблицах с ORDER by '-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 появляется для сортировки значения первого столбца.