Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / group by / 25 сообщений из 36, страница 1 из 2
04.04.2018, 13:32
    #39625483
Dorin Marcoci
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Подскажите плиз, почему птица не хочет групировать так? вроди ничего криминального...

Код: sql
1.
2.
3.
4.
5.
select
  iif(s.bundle_id is not null, 10, coalesce((select 3 from ta_bundle b where b.submit_slot_id = s.id and b.status_id = 3 rows 1), 1)) as status_id
from ta_submit_slot s
where s.submit_id = :submit_id
group by 1
...
Рейтинг: 0 / 0
04.04.2018, 15:03
    #39625556
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Dorin Marcoci,

Вроде нет криминала. И вроде группирует. Только смысл группировать одно поле?
...
Рейтинг: 0 / 0
04.04.2018, 15:19
    #39625571
Dorin Marcoci
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Будут потом и другие поля, упростил пример...

Странно, я в эксперте получаю

Код: plaintext
1.
2.
3.
4.
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).

FB 3.0.2 x64

если абстрактизировал типа

Код: sql
1.
2.
3.
4.
select
  iif(null is not null, 10, coalesce((select 1 from rdb$database rows 1), 1)) as status_id
from rdb$database s
group by 1


то работает...
...
Рейтинг: 0 / 0
04.04.2018, 15:29
    #39625577
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Dorin Marcoci,

Ты внутри используешь привязку к s.id
Но по этому полю нет группировки.
...
Рейтинг: 0 / 0
04.04.2018, 15:42
    #39625583
Dorin Marcoci
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
убрал s.id но тоже не хочет, хотя мне надо с s.id, без group by работает

вот, удалось сделать абстрактный пример который тоже ошибку выдает:

Код: sql
1.
2.
3.
4.
select
  iif(s.rdb$relation_id is not null, 10, coalesce((select 3 from rdb$database b), 1)) as status_id
from rdb$database s
group by 1



если вместо s.rdb$relation_id константа, то нету ошибок
...
Рейтинг: 0 / 0
04.04.2018, 16:33
    #39625629
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Код: sql
1.
2.
3.
4.
select
  max(iif(s.rdb$relation_id is not null, 10, coalesce((select 3 from rdb$database), 1))) as status_id
from rdb$database s
group by iif(s.rdb$relation_id is not null, 10, coalesce((select 3 from rdb$database), 1))
...
Рейтинг: 0 / 0
04.04.2018, 22:12
    #39625764
Dorin Marcoci
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Почему max(? здесь же iif( где выходит один одно целое поле.
теоретически можно же групировать такое. здесь больше похоже на глюк.
...
Рейтинг: 0 / 0
05.04.2018, 01:18
    #39625805
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Dorin Marcoci,

а что, iif стал агрегатной функцией?
...
Рейтинг: 0 / 0
05.04.2018, 07:09
    #39625831
Exteris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
kdvа что, iif стал агрегатной функцией?
Обычно IIF вполне себе нормально группируется.
...
Рейтинг: 0 / 0
05.04.2018, 07:10
    #39625832
Exteris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Dorin Marcociвот, удалось сделать абстрактный пример который тоже ошибку выдает:

Код: sql
1.
2.
3.
4.
select
  iif(s.rdb$relation_id is not null, 10, coalesce((select 3 from rdb$database b), 1)) as status_id
from rdb$database s
group by 1



если вместо s.rdb$relation_id константа, то нету ошибок

Если убрать
Код: plaintext
select 3 from rdb$database b
, то ошибки тоже нет.
...
Рейтинг: 0 / 0
05.04.2018, 10:36
    #39625935
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Блин, глаз замылился.
Запрос с GROUP BY без агрегатных функций возможен только для констант.
...
Рейтинг: 0 / 0
05.04.2018, 10:39
    #39625938
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Exteris,

даже если и бы - чего вы пытаетесь парсер ... обмануть? Пишите как положено.
...
Рейтинг: 0 / 0
05.04.2018, 11:14
    #39625969
Exteris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
WildSeryБлин, глаз замылился.
Запрос с GROUP BY без агрегатных функций возможен только для констант.
А что в данном случае не константа?


Код: sql
1.
2.
3.
4.
select
  iif(1=0, 10, coalesce((select 3 from rdb$database b), 1)) as status_id
from rdb$database s
group by 1

Ошибки нет.

Код: sql
1.
2.
3.
4.
select
  iif(s.rdb$relation_id is null, 10, coalesce(null, 1)) as status_id
from rdb$database s
group by 1

Ошибки нет.

Код: sql
1.
2.
3.
4.
select
  iif(s.rdb$relation_id is null, 10, coalesce((select 3 from rdb$database b), 1)) as status_id
from rdb$database s
group by 1

Ошибка есть.
...
Рейтинг: 0 / 0
05.04.2018, 11:46
    #39626001
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
ExterisА что в данном случае *не* константа?

s.rdb$relation_id
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.04.2018, 12:34
    #39626044
Dorin Marcoci
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Почему обмануть?

Вот этот не пашет:

Код: sql
1.
2.
3.
4.
5.
6.
select
  iif(s.bundle_id is not null, 10, coalesce((select 3 from ta_bundle b where b.submit_slot_id = s.id and b.status_id = 3 rows 1), 1)) as status_id,
  count(*)
from ta_submit_slot s
where s.submit_id = :submit_id
group by 1



А этот работает:

Код: sql
1.
2.
3.
4.
5.
6.
select
  iif(s.bundle_id is not null, 10, coalesce(5, 1)) as status_id,
  count(*)
from ta_submit_slot s
where s.submit_id = :submit_id
group by 1



И этот тоже работает:

Код: sql
1.
2.
3.
4.
5.
6.
select
  iif(true, 10, coalesce((select 1 from rdb$database rows 1), 1)) as status_id,
  count(*)
from ta_submit_slot s
where s.submit_id = :submit_id
group by 1
...
Рейтинг: 0 / 0
05.04.2018, 12:44
    #39626051
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Dorin Marcoci,

а если iif заменить на case ?
...
Рейтинг: 0 / 0
05.04.2018, 12:51
    #39626058
Sergey1979
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Код: sql
1.
2.
3.
4.
select
  iif(s.rdb$relation_id is null, 10, coalesce((select 3 from rdb$database b), 1)) as status_id
from rdb$database s
group by 1



Так ошибка.
Однако вот так
Код: sql
1.
2.
3.
4.
5.
6.
with TMP as (select
  iif(s.rdb$relation_id is null, 10, coalesce((select 3 from rdb$database b), 1)) as status_id
from rdb$database s)
select status_id
from TMP
group by 1


всё работает.
...
Рейтинг: 0 / 0
05.04.2018, 13:13
    #39626073
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Dorin MarcociПочему обмануть?

Вот этот не пашет:

Код: sql
1.
2.
3.
4.
5.
6.
select
  iif(s.bundle_id is not null, 10, coalesce((select 3 from ta_bundle b where b.submit_slot_id = s.id and b.status_id = 3 rows 1), 1)) as status_id,
  count(*)
from ta_submit_slot s
where s.submit_id = :submit_id
group by 1




А этот работает:

Код: sql
1.
2.
3.
4.
5.
6.
select
  iif(s.bundle_id is not null, 10, coalesce(5, 1)) as status_id,
  count(*)
from ta_submit_slot s
where s.submit_id = :submit_id
group by 1




И этот тоже работает:

Код: sql
1.
2.
3.
4.
5.
6.
select
  iif(true, 10, coalesce((select 1 from rdb$database rows 1), 1)) as status_id,
  count(*)
from ta_submit_slot s
where s.submit_id = :submit_id
group by 1

Мне кажется, с этим уже можно в трекер
...
Рейтинг: 0 / 0
05.04.2018, 13:14
    #39626075
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Exteris
Код: sql
1.
2.
3.
4.
select
  iif(1=0, 10, coalesce((select 3 from rdb$database b), 1)) as status_id
from rdb$database s
group by 1


Ошибки нет.

Код: sql
1.
2.
3.
4.
select
  iif(s.rdb$relation_id is null, 10, coalesce(null, 1)) as status_id
from rdb$database s
group by 1


Ошибки нет.

Код: sql
1.
2.
3.
4.
select
  iif(s.rdb$relation_id is null, 10, coalesce((select 3 from rdb$database b), 1)) as status_id
from rdb$database s
group by 1


Ошибка есть.А с этим - ещё лучше. В трекер, плс
...
Рейтинг: 0 / 0
05.04.2018, 13:21
    #39626079
Dorin Marcoci
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Влад, через case тоже не хочет. Как я понял iif внутри тоже в case превращается.
Без group by все ok:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
  case
    when (s.bundle_id is not null) then 10
    else coalesce((select 3 from ta_bundle b where b.submit_slot_id = s.id and b.status_id = 3 rows 1), 1)
  end as status_id
--  , count(*)
from ta_submit_slot s
where s.submit_id = :submit_id
-- group by 1



Кстати заметил что так, (not null) принимает, а в эту ветку не входит, когда s.bundle_id not null, или так задуманно?

Код: sql
1.
2.
  case s.bundle_id
    when (not null) then 10
...
Рейтинг: 0 / 0
05.04.2018, 13:31
    #39626087
Dorin Marcoci
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Да, жесть, через CTE работает:

Код: sql
1.
2.
3.
4.
5.
6.
7.
with tmp as (
  select iif(s.bundle_id is not null, 10, coalesce((select 3 from ta_bundle b where b.submit_slot_id = s.id and b.status_id = 3 rows 1), 1)) as status_id
  from ta_submit_slot s
  where s.submit_id = :submit_id)
select t.status_id, count(*)
from tmp t
group by 1



Спасибо Sergey1979, буду пока так сделать, вроди читает оптимально. Вчера делал через left join SP_ но не так красиво.
...
Рейтинг: 0 / 0
05.04.2018, 13:36
    #39626091
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Dorin MarcociВлад, через case тоже не хочетДа, я уже попробовал.

Dorin MarcociКстати заметил что так, (not null) принимает, а в эту ветку не входитДумаю, тоже баг, можно вот с этим в трекер
Код: sql
1.
2.
3.
4.
5.
6.
7.
select s.rdb$relation_id, case s.rdb$relation_id when null then 'null' else 'not null' end
  from rdb$database s

union all

select s.rdb$relation_id, case s.rdb$relation_id when not null then 'not null' else 'null' end
  from rdb$database s

Возвращает
RDB$RELATION_ID F_1129 not null129 null
...
Рейтинг: 0 / 0
05.04.2018, 13:40
    #39626094
Dorin Marcoci
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
OK, спасибо всем!, добавлю тикеты к вечеру
...
Рейтинг: 0 / 0
05.04.2018, 13:51
    #39626098
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
not TRUE = FALSE
2 + 1 = 3

not NULL = NULL
NULL + 1 = NULL

((что угодно) = NULL ) = FALSE

подозреваю, но проверять лень, что

( NULL = NULL ) = NULL => FALSE (если принудительно поднимать тип к boolean not null)

в то же время

(NULL is not distinct from NULL ) = TRUE

(NULL NULL ) = FALSE

Код: sql
1.
2.
  case s.bundle_id
    when (not null) then 10

[/quote]

это если развернуть в полную форму будет

Код: sql
1.
2.
  case 
    when s.bundle_id = null then 10

[/quote]
...
Рейтинг: 0 / 0
05.04.2018, 13:54
    #39626099
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by
Dorin MarcociКстати заметил что так, (not null) принимает, а в эту ветку не входитВчитываясь в стандарт, вижу, что есть два разных случая

1. сравнение с выражением
case <expr> when [not] null then ... end

тут аналогия с <expr> = [not] null и результат всегда false

2. тестирование на нулл
case <expr> when is [not] null then ... end

тут аналогия с <expr> is [not] null и результат зависит от <expr>

Первый случай мы как раз имеем выше, и это не баг.
А второй у нас не поддерживается синтаксисом, можно попросить поддержать. Но это тоже не баг.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / group by / 25 сообщений из 36, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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