ORDER BY ДЕКОДИРУЕТ (ВЗДОР, [НОМЕР СТОЛБЦА]) на запросе отдельного столбца.Как это работает?

Привет я нуждаюсь в помощи для понимания части декодирования запроса, который идет что-то как следующее.

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 или какое-либо из других чисел?

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

12
задан Azeworai 19 February 2010 в 00:15
поделиться

3 ответа

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

Если 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 в качестве значения сортировки для этой строки.

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

4
ответ дан 2 December 2019 в 22:22
поделиться

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')
5
ответ дан 2 December 2019 в 22:22
поделиться

Относительно этой части вашего вопроса:

Я думаю, что 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, похоже, сортирует по значению первого столбца.

1
ответ дан 2 December 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: