ПОРЯДОК ПО ДЕКОДИРОВАНИЮ (БЛА-БЛА-БЛА, [НОМЕР СТОЛБЦА]) в запросе с одним столбцом.Как это работает?

StackOverflow https://stackoverflow.com/questions/2293238

  •  21-09-2019
  •  | 
  •  

Вопрос

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

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 возвращает разные номера столбцов для УПОРЯДОЧИВАНИЯ ПО with, и я попытался поэкспериментировать с другим простым выбором одного столбца в некоторых других таблицах с ПОРЯДКОМ '-1', '0' и '100', и ПОРЯДОК по, похоже, не выполняется для 0 и 100.Почему это работает с -1 или любым другим числом?

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

вы переводите СОБАКУ в значение 1, КОШКУ в значение 2, УГРЯ в значение 3 и других в значение 5.Затем упорядочьте по полученному числовому значению (то есть сначала СОБАКА, затем КОШКА, затем УГОРЬ, наконец, что-нибудь еще).

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

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

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

Я думаю, что DECODE возвращает разные номера столбцов для УПОРЯДОЧЕНИЯ ПО with и я попытался поэкспериментировать с разными простыми выборками из одного столбца в некоторых других таблицах с ORDER by '-1', '0' и '100' и ORDER by кажется, что для 0 и 100 выполняется сбой.Почему это работает с -1 или любым другим числами?

Ваше замешательство вполне понятно;но нет, значения, возвращаемые ДЕКОДИРОВАНИЕМ, не интерпретируются как номера столбцов.

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

SELECT a, b FROM some_table ORDER BY 1,2

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

SELECT a, b FROM some_table ORDER BY a,b

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top