Привет я нуждаюсь в помощи для понимания части декодирования запроса, который идет что-то как следующее.
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 работает с различными числами несуществующего столбца, предоставленными ДЕКОДИРОВАНИЕМ. Запрос работает курсором для нахождения уникального кода для рассматриваемого животного, учитывая мнемосхему животных текущим типом животных и типом, который будет согласован.
Я думаю, что ДЕКОДИРУЮТ, возвращает различные номера столбцов ORDER BY с, и я пытался экспериментировать с другим простым отдельным столбцом, выбирает на некоторых других таблицах с ПОРЯДКОМ '-1', '0' и '100' и ПОРЯДОК, кажется, перестал работать для 0 и 100. Почему это работает с-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 в качестве значения сортировки для этой строки.
Это дает своего рода условную циртерию сортировки. Часто используется для обеспечения того, чтобы определенные элементы всегда находились вверху или внизу отсортированного набора.
ORDER BY может использовать одно из трех выражений. Во-первых, псевдоним списка выбора, во-вторых, номер столбца в списке выбора list или, в-третьих, выражение SQL, которое может использовать ноль или более столбцов из исходных таблиц.
Таким образом, когда вы используете ORDER BY 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')
Относительно этой части вашего вопроса:
Я думаю, что DECODE возвращает разные номера столбцов для ORDER BY и я попробовал поэкспериментировать с разными простыми селектами по одному столбцу на некоторых других таблицах с ORDER by '-1', '0' и '100' и ORDER by похоже, не работает для 0 и 100. Почему он работает с -1 или любым другим
Ваша путаница понятна; но нет, значения, возвращаемые DECODE, не интерпретируются как номера столбцов.
Oracle поддерживает небольшое синтаксическое сокращение, при котором на столбцы результирующего набора можно ссылаться позиционно в предложении ORDER BY. Так, например, this:
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
, похоже, сортирует по значению первого столбца.