Обновить
79
Sayan Malakshinov@xtender

FBCS, Oracle ACE, performance tuning expert

93
Подписчики
Отправить сообщение
Странно я вроде так и писал в своей статье
Вы нигде не указали, что ваш запрос невалиден! Неудивительно, что вы получаете недокументированный результат на запрос невалидный с точки зрения той же документации.
Как меня поражает все-таки наглая попытка увильнут и как-то откреститься от своих же слов и действий. Внимательно смотрите что я процитировал в исходном комменте.
Пройдемся спокойно по списочку:
1. Вы пишете кривой недокументированный запрос
2. Снабжаете его неверной интерпретацией
3. Получаете кривые данные кривого запроса
4. Пытаетесь сделать из этих данных какой-то совершено не взаимосвязанный вывод.
5. В выводе косвенно заявляете о том, что все написанное выше это ошибки разработчиков mysql, но не уточняете, что как минимум этот ваш запрос — это именно ваша ошибка.

Я несколько раз пытался намекнуть, а после уже прямым текстом сказал, что запрос вы пишете невалидный. Багом является то, что не выдает ошибки при запросе об отстутствии агрегата. Не пытайтесь анализировать на невалидных запросах, что вы постоянно пытаетесь делать как и в случаете с enum.
А еще раз подумать:
Sorting ENUM values are sorted based on their index numbers,
Ваше нежелание думать при написании запросов не позволяет мне продолжать с вами дискуссию.
А вас не смущает писать идиотские невалидные запросы? причем внимательно посмотрите на то, что сами написали:
Как вы понимаете данный запрос вернет нам уникальные значения первой колонки которых как мы знаем два: ноль и NULL
уберите в запросе дистинкт-может быть это вас натолкнет на верный путь. хотя вам проще почитать про стандарт сиквела
Некорректно сравнивать максимум енума(де факто другой формат) с числом.
Еще раз хорошенько подумайте… Нет у вас тут никакой группировки! У вас нет аггрегата! Вы используете исключительно кривой запрос с багом.
А если подумать?
Если и подумать не помогло:
«Доказательство», что 1=2=3=4:
mysql> create table null_equals_zero(int_value     int,
    ->                               group_value   int
    ->                              )
    -> engine = innodb;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into null_equals_zero
    ->      values (1, 1), (2, 1), (3, 1), (4, 1);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select   distinct int_value
    ->     from null_equals_zero
    -> group by group_value;
+-----------+
| int_value |
+-----------+
|         1 |
+-----------+
1 row in set (0.00 sec)



select   distinct int_value
    from null_equals_zero
group by group_value;


Как вы понимаете данный запрос вернет нам уникальные значения первой колонки которых как мы знаем два: ноль и NULL
Я такого запроса категорически не понимаю! Что за группировка по второму полю, а дистинкт без агрегата по первому?
Строго говоря, пример неудачный, т.к. в oracle char не может быть «пустой строкой». Просто посмотрите его длину. Отличие действительно есть в pl/sql, но единственное и категорически не связано с char'aми:
create or replace function f_is_null(s varchar2) return varchar2 is
  type tt is table of number index by varchar2(10);
  vt tt;
  e exception;
  pragma exception_init(e,-6502);
begin
  vt(s):=1;
  return case 
           when s is null then 'empty' 
           else 'not empty' 
         end;
exception 
  when e then return 'null';
end;
/
declare
  pkey1 varchar2(10):='';
  pkey2 varchar2(10):=null;
  pkey3 varchar2(10):='filled';
begin
  dbms_output.put_line('pkey1-'||f_is_null(pkey1));
  dbms_output.put_line('pkey2-'||f_is_null(pkey2));
  dbms_output.put_line('pkey3-'||f_is_null(pkey3));
end;
/
Например,
  (select level a from dual connect by level <= 5) q1,
  (select level a from dual connect by level <= 5) q2,
  (select level a from dual connect by level <= 5) q3,
  (select level a from dual connect by level <= 5) q4,
  (select level a from dual connect by level <= 5) q5,
  (select level a from dual connect by level <= 5) q6,
  (select level a from dual connect by level <= 5) q7,
  (select level a from dual connect by level <= 5) q8,
  (select level a from dual connect by level <= 5) q9,
  (select level a from dual connect by level <= 5) q10,
  (select level a from dual connect by level <= 5) q11,
  (select level a from dual connect by level <= 5) q12,
  (select level a from dual connect by level <= 5) q13,
  (select level a from dual connect by level <= 5) q14,
  (select level a from dual connect by level <= 5) q15,
  (select level a from dual connect by level <= 5) q16,
  (select level a from dual connect by level <= 5) q17,
  (select level a from dual connect by level <= 5) q18,
  (select level a from dual connect by level <= 5) q19,
  (select level a from dual connect by level <= 5) q20

сократить до:
with g as (select level a from dual connect by level <= 5)
select * 
from g  q1, g  q2, g  q3, g  q4, g  q5, g  q6, g  q7, g  q8, g  q9, g q10
    ,g q11, g q12, g q13, g q14, g q15, g q16, g q17, g q18, g q19, g q20
Хмъ, ничего особенного в решении не вижу — элементарно в лоб прописаны условия. Я как минимум его сократил бы раза в два-три по количеству кода.
Функции pivot в стандарте SQL нету, я знаю только в MSSQL расширении

И в оракле тоже есть
Комиссия за перевод внутри банка у сбера только если карты в разных банках
ага, хорошее уточнение :) но хрен с ним, что снимают при переводе на чужие счета в разных региональных подразделениях/филиалах(мне теперь совершенно безразлично как они де-юре называются), меня больше раздражает, что даже между своими счетами! Именно по этой причине я уже не их клиент.
кстати у меня в аватаре тоже japh :)
Мой любимый язык и имхо самый элегантный и дающий наиболее широкий простор для фантазии :)
Не гольфичный japh, красивее было бы до 80 сократить :)
ну можно джойном с пивот таблицей. А отличие в другом — то что я показал можно легко выполнять в инлайн вью, т.е. прямо в запросе. Соответственно все можно решить одним запросом с однократным чтением таблицы

Информация

В рейтинге
Не участвует
Дата рождения
Зарегистрирован
Активность