powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
25 сообщений из 54, страница 1 из 3
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006220
clipper1995
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В легаси системе достался код, который местами меня сбивает с толку.
Про order by 1 и т.д. я всегда знал, что так можно задать номер колонки.
У меня в коде я встретил order by, в который подставляется строка '0' либо '1', в зависимости от значения, возвращаемого instr, и у меня не получилось найти, что это означает.
Или это просто кривоватый код, который не ломается?
Что такое в запросе ORDER BY '0' или ORDER BY '1'???

select *
from table1 t1, table2 t2, table3 t3, table4 t4
where t1.id=a2.id and a1.acc=a3.id(+)
and t1.name = P_NAME
and t4.state = t2.status
order by DECODE(INSTR(P_TEXT,'~'||a3.VID||'~'),null,0,0,0,1) desc
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006224
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
clipper1995,

В конкретно этом запросе - числовые значения для возврата первыми строк в тексте которых есть искомое значение.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006228
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
clipper1995у меня не получилось найти, что это означает.

Сортировка по выражению. Ничем не отличатся от, например, "order by x + y * 2".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006231
Агрох
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой код понятен?
Что произойдёт при выполнении?
Что будет, если из SELECT убрать строку CASE WHEN ID > 100 THEN 1 ELSE 0 END (но не убирать из ORDER BY)?

Код: plsql
1.
2.
3.
4.
5.
6.
SELECT
  ID,
  NAME,
  CASE WHEN ID > 100 THEN 1 ELSE 0 END AS ID_STATE
FROM Table
ORDER BY CASE WHEN ID > 100 THEN 1 ELSE 0 END
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006234
clipper1995
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
clipper1995,

В конкретно этом запросе - числовые значения для возврата первыми строк в тексте которых есть искомое значение.


а в каком поле?
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006235
clipper1995
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
clipper1995
env
clipper1995,

В конкретно этом запросе - числовые значения для возврата первыми строк в тексте которых есть искомое значение.


а в каком поле? Выражение decode ... в запросе выдаст наружу либо '0' либо '1'
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006236
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
clipper1995,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select 
    *
from 
    table1 t1, 
    table2 t2, 
    table3 t3, 
    table4 t4
where 
    t1.id=a2.id and a1.acc=a3.id(+)
    and t1.name = P_NAME
    and t4.state = t2.status
order by 
    DECODE(INSTR(P_TEXT,'~'||a3.VID||'~'),null,0,0,0,1) desc 
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006237
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
del
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006239
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
clipper1995
Выражение decode ... в запросе выдаст наружу либо '0' либо '1'

Выдаст числовое значение 1 или 0 в зависимости от результата instr. Не надо путать с позиционной нотацией.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006247
clipper1995
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

То есть даже если колонка запрятана внутрь функций, то ORDER BY все равно её увидит?
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006248
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
rom 
    table1 t1, 
    table2 t2, 
    table3 t3, 
    table4 t4
where 
    t1.id=a2.id and a1.acc=a3.id(+)
    and t1.name = P_NAME



Пожалуй, я не прав. Этот запрос просто не будет работать
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006254
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
clipper1995
ORDER BY все равно её увидит?


Вы упорно путаете позиционную нотацию, задаваемую парсеру в тексте запроса
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with t as (
    select 1 id, 1 n from dual union all
    select 2 id, 3 n from dual union all
    select 3 id, 7 n from dual
)
select
    *
from 
    t
order by 
    1 desc;


и сортировку по вычисляемому значению выражения
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with t as (
    select 1 id, 1 n from dual union all
    select 2 id, 3 n from dual union all
    select 3 id, 7 n from dual
)
select
    *
from 
    t
order by 
    case when mod(n,3) = 0 then 1 else 0 end desc;
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006257
clipper1995
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

Спасибо, понятно.

Просто я ошибочно полагал, что сначала вычисляется DECODE, потом результат 0 или 1 'подставляется' в ORDER BY
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006274
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
clipper1995

Просто я ошибочно полагал, что сначала вычисляется DECODE, потом результат 0 или 1 'подставляется' в ORDER BY


Полезное замечание.

Order by 1, order by val - параметры - названия колонок

Order by 3/3, order by lower('Val') - параметры - выражения

Я недавно читал рекомендации избегать использование order by 1.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006281
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLOrder by 1, order by val - параметры - названия колонок

Нет, во втором случае это тоже выражение, возвращающее значение колонки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006288
Агрох
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Нет, во втором случае это тоже выражение, возвращающее значение колонки.


Да и в первом случае это порядковый номер выражения в SELECT-е.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006290
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

во втором случае это тоже выражение, возвращающее значение колонки.

не факт




Тут 3 варианта:
expr
position
c_alias

к сожалению, я не очень понимаю, по каким критериам Oracle "последовательность буковок и циферек" которые встретились после ORDER BY относит к одному из трех (((

"c_alias
Specify an alias for the column expression. Oracle Database will use this alias in the column heading of the result set. The AS keyword is optional. The alias effectively renames the select list item for the duration of the query. The alias can be used in the order_by_clause but not other clauses in the query"
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006298
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

НеофитSQLOrder by 1, order by val - параметры - названия колонок

Нет, во втором случае это тоже выражение, возвращающее значение колонки.


Ёклмн! Вы только что вырвали с корнем росток моей надежды что в этой области все просто и логично.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006300
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL
Dimitry Sibiryakov

пропущено...

Нет, во втором случае это тоже выражение, возвращающее значение колонки.


Ёклмн! Вы только что вырвали с корнем росток моей надежды что в этой области все просто и логично.


Э нет, подождите.

Код: plsql
1.
2.
3.
4.
5.
with tst(n,s) as (select 1, 'One' from dual union all
                  select 2, 'Two' from dual union all
                  select 3, 'Tri' from dual)
select * from tst
order by 6/3



не сортирует вторую колонку, а "order by 2" - сортирует.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006302
Агрох
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Код: plsql
1.
2.
3.
4.
5.
SELECT
  ID AS SUPER_ID,
  NAME
FROM TABLE
ORDER BY SUPER_ID + 1
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006310
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev

Тут 3 варианта:
expr
position
c_alias

к сожалению, я не очень понимаю, по каким критериам Oracle "последовательность буковок и циферек" которые встретились после ORDER BY относит к одному из трех (((

"c_alias
Specify an alias for the column expression. Oracle Database will use this alias in the column heading of the result set. The AS keyword is optional. The alias effectively renames the select list item for the duration of the query. The alias can be used in the order_by_clause but not other clauses in the query"


Я не могу полагаться на интуитивное понимание, ввиду скромного опыта, но мои эксперименты говорят о следующем:
позиция - в формате неотрицательной константы типа NUMBER (3.14 можно, 2f нельзя). Дает ошибку если =0 или больше числа колонок. По смыслу не пересекается с выражением, т.к. сортировка по константе не полезна.

алиас - имя колонки запроса, оно синтаксически отличается от выражения или константы, т.к. парсер его знает или оно так обозначено - см пример ниже

Все остальное считается выражением.


Код: plsql
1.
2.
3.
4.
5.
with tst(n,"1") as (select 1, 'One' from dual union all
                  select 2, 'Two' from dual union all
                  select 3, 'Tri' from dual)
select * from tst
order by "1" -- алиас второй колонки 



Я не разбирал, как обрабатываются конфликты имен, когда алиас совпадает с именем функции без параметров.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006311
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev


Тут 3 варианта:
expr
position
c_alias

к сожалению, я не очень понимаю, по каким критериам Oracle "последовательность буковок и циферек" которые встретились после ORDER BY относит к одному из трех (((



алиас, выражение - понятно
позиия - ето допустимый цифровой порядковый номер

в древних версиях, для некошерных селектов position отличная весчь
в плюсе для лентяев (для меня) тож неплохо смотрится, мне удобно

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
SQL> ed
Wrote file afiedt.buf

  1  select 0 s,dname name from dept d
  2  union all
  3  select 1 s,'-----'  from dual
  4  union all
  5  select 2 s,ename  from emp e
  6* order by s, name
SQL> /
order by s, name
            *
ERROR at line 6:
ORA-00904: "NAME": invalid identifier

SQL> ed
Wrote file afiedt.buf

  1  select 0 s,dname name from dept d
  2  union all
  3  select 1 s,'-----'  from dual
  4  union all
  5  select 2 s,ename  from emp e
  6* order by 1, 2
SQL> /

         S NAME
---------- --------------
         0 ACCOUNTING
         0 OPERATIONS
         0 RESEARCH
         0 SALES
         1 -----
         2 ADAMS
         2 ALLEN



даж жаль что для group by пока что не сделали по position / alias

.....
stax
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006313
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Не один же раз разбирали уже почему так.
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006315
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL


Я не разбирал, как обрабатываются конфликты имен, когда алиас совпадает с именем функции без параметров.


На первый взгляд, конфликты с алиасами колонок разрешаются по правилу scope. Местное определение затеняет более широкое.

В целом, у параметров ORDER BY пока вижу логичное поведение, кроме возможно дробных позиций колонки.
"ORDER BY 1.999" сортирует первую колонку, насколько это будет продолжать работать, неизвестно.

Код: plsql
1.
2.
3.
4.
5.
with tst(n,"sysdate") as (select 1, 'One' from dual union all
                  select 2, 'Two' from dual union all
                  select 3, 'Tri' from dual)
select * from tst
order by sysdate
...
Рейтинг: 0 / 0
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
    #40006316
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Я не разбирал, как обрабатываются конфликты имен, когда алиас совпадает с именем функции без параметров

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2      select 1 id, 1 sysdate from dual union all
  3      select 2 id, 3  from dual union all
  4      select 3 id, 7  from dual
  5  )
  6  select
  7      t.id, t."sysdate"
  8  from
  9      t
 10  order by
 11*     sysdate desc
SQL> /
    select 1 id, 1 sysdate from dual union all
                   *
ERROR at line 2:
ORA-00923: FROM keyword not found where expected


SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2      select 1 id, 1 "sysdate" from dual union all
  3      select 2 id, 3  from dual union all
  4      select 3 id, 7  from dual
  5  )
  6  select
  7      t.id, t."sysdate"
  8  from
  9      t
 10  order by
 11*     sysdate desc
SQL> /

        ID    sysdate
---------- ----------
         1          1
         3          7
         2          3

SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2      select 1 id, 1 "sysdate" from dual union all
  3      select 2 id, 3  from dual union all
  4      select 3 id, 7  from dual
  5  )
  6  select
  7      t.id, t."sysdate"
  8  from
  9      t
 10  order by
 11*     t.sysdate desc
SQL> /
    t.sysdate desc
      *
ERROR at line 11:
ORA-01747: invalid user.table.column, table.column, or column specification


SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2      select 1 id, 1 "sysdate" from dual union all
  3      select 2 id, 3  from dual union all
  4      select 3 id, 7  from dual
  5  )
  6  select
  7      t.id, t."sysdate"
  8  from
  9      t
 10  order by
 11*     t."sysdate" desc
SQL> /

        ID    sysdate
---------- ----------
         3          7
         2          3
         1          1
...
Рейтинг: 0 / 0
25 сообщений из 54, страница 1 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]