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