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
появляется для сортировки значения первого столбца.