Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1' / 25 сообщений из 54, страница 1 из 3
07.10.2020, 15:22
    #40006220
clipper1995
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
В легаси системе достался код, который местами меня сбивает с толку.
Про 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
07.10.2020, 15:25
    #40006224
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
clipper1995,

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

Сортировка по выражению. Ничем не отличатся от, например, "order by x + y * 2".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.10.2020, 15:30
    #40006231
Агрох
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
Такой код понятен?
Что произойдёт при выполнении?
Что будет, если из 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
07.10.2020, 15:31
    #40006234
clipper1995
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
env
clipper1995,

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


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

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


а в каком поле? Выражение decode ... в запросе выдаст наружу либо '0' либо '1'
...
Рейтинг: 0 / 0
07.10.2020, 15:33
    #40006236
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
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
07.10.2020, 15:33
    #40006237
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
del
...
Рейтинг: 0 / 0
07.10.2020, 15:34
    #40006239
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
clipper1995
Выражение decode ... в запросе выдаст наружу либо '0' либо '1'

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

То есть даже если колонка запрятана внутрь функций, то ORDER BY все равно её увидит?
...
Рейтинг: 0 / 0
07.10.2020, 15:41
    #40006248
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
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
07.10.2020, 15:45
    #40006254
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
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
07.10.2020, 15:48
    #40006257
clipper1995
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
env,

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

Просто я ошибочно полагал, что сначала вычисляется DECODE, потом результат 0 или 1 'подставляется' в ORDER BY
...
Рейтинг: 0 / 0
07.10.2020, 16:08
    #40006274
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
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
07.10.2020, 16:23
    #40006281
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
НеофитSQLOrder by 1, order by val - параметры - названия колонок

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

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


Да и в первом случае это порядковый номер выражения в SELECT-е.
...
Рейтинг: 0 / 0
07.10.2020, 16:33
    #40006290
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
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
07.10.2020, 16:49
    #40006298
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
Dimitry Sibiryakov

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

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


Ёклмн! Вы только что вырвали с корнем росток моей надежды что в этой области все просто и логично.
...
Рейтинг: 0 / 0
07.10.2020, 16:53
    #40006300
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
Неофит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
07.10.2020, 16:54
    #40006302
Агрох
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
Leonid Kudryavtsev,

Код: plsql
1.
2.
3.
4.
5.
SELECT
  ID AS SUPER_ID,
  NAME
FROM TABLE
ORDER BY SUPER_ID + 1
...
Рейтинг: 0 / 0
07.10.2020, 17:06
    #40006310
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
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
07.10.2020, 17:13
    #40006311
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
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
07.10.2020, 17:16
    #40006313
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
Stax,

Не один же раз разбирали уже почему так.
...
Рейтинг: 0 / 0
07.10.2020, 17:17
    #40006315
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
Неофит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
07.10.2020, 17:18
    #40006316
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1'
Неофит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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не смог нагуглить, что такое ORDER BY '0' или ORDER BY '1' / 25 сообщений из 54, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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