powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Использование Coalesce для учёта Null
30 сообщений из 30, показаны все 2 страниц
Использование Coalesce для учёта Null
    #39309523
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения за корявое название темы.
Продолжаю оптимизацию запросов.
FB3. Есть запросы типа:
Код: sql
1.
2.
3.
select a.*
from a
where a.pid is null


и
Код: sql
1.
2.
3.
select a.*
from a
where a.pid=100


pid - поле ключевое, 100 - это некий параметр, на самом деле переменная.
Чтобы не писать два разных запроса, кто-то предложил народу вариант:
Код: sql
1.
2.
3.
select a.*
from a
where coalesce(a.pid,0)=:pid -- pid - переменная 


Оказывается, индекс по pid при таком запросе не используется. Как можно изменить запрос, чтобы он пошёл по индексу. Или может быть ссылку на решение (наверняка это всё было, но я не нашёл).
Да, попробовал сделать в конструкции where условие or. Результат сильно лучше, но хуже, чем отдельные запросы, и как-то не красиво.
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309530
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
where a.pid = :pid or a.pid is null



В Fib-aх помню были умные параметры, и сами адаптировали SQL на = или is null в зависимости от значения параметра.

Через coalesce ты "меняешь" значение поля, что неправильно.
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309531
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, так: where a.pid = :pid or :pid is null
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309535
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

во-первых предложенное народом совсем не эквивалентно. Во-вторых если pid действительно ключевое поле, то зачем вообще условие where a.pid is null? Это же будет пустая выборка.
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309547
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,
может быть тебе просто подойдёт

Код: sql
1.
2.
3.
select a.*
from a
where a.pid is not distinct from :pid
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309560
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,
Я в посте написал, что or работает, но не до конца эффективно. Грубо говоря, делается два прохода.
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309565
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

нет там двух проходов. Там что-то типа условного плана, т.е. составляется как бы две версии плана, по какой ветке пойдёт выполнение определяется в зависимости от значения параметра. Проблемы там конечно есть, но только на более сложных случаях.
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309567
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Поле ключевое, но это не первичный ключ. Null'ы есть. И как раз их надо учесть. Distinct, к сожалению, этого не делает.
Как пример - справочник с деревянной структурой. "Верхний" уровень имеет pid=null. Остальные уровни имеют pid не null, а конкретное значение. Но запрос по вытаскиванию ветки один.
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309568
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

ты бы сначала озвучил что хочешь, а то не очень ясно. То ли получить значения в которых a.pid is null, то ли получить все строки, если параметр равен null.
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309569
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

is not distinct from как раз таки сравнивает с учётом null и при этом использует индекс
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309570
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

авторчто or работает, но не до конца эффективно
А что думаешь что функция coalesce() будет эффективнее? На "or" еще есть надежда пологатся па оптимайзер.

Самый верный подход когда хочется запись по id/pid или все если не указан парам, то задать заранее правильный SQL серверу.
Всякие FB либы имеют типа Conditions.Add('pid = :pid'), или самому добавить в текст запроса. Один if до запроса и все.

Хотя, супер оптимайзер мог бы вычислить (:pid is null) как true константу в начале, или может ошибаюсь.
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309580
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIDistinct, к сожалению, этого не делает.
Делает. Или ты что-то делаешь неправильно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309599
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcociи сами адаптировали SQL на = или is null в зависимости от значения параметра.

сейчас FB это и сам умеет - WHERE x IS NOT DISTICNT FROM y

осталось ещё запилить WHERE x in (10,20, NULL, 30, 40)
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309602
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Спасибо всё-таки за наводку. Разобрался. Если :pid - null, то всё работает. А если :pid=0, то вариант такой:
Код: sql
1.
2.
3.
select a.*
from a
where a.pid is not distinct from iif(:pid=0,null,:pid)


В хранимках, естественно, используется null, а из клиента лезет 0.
Почитаю про "is distinct from". Это в трёшке появилось?
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309603
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochосталось ещё запилить WHERE x in (10,20, NULL, 30, 40)

с этим в сад
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309606
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

нет, вроде ещё в 2.1 или даже в 2.0
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309612
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

Код: sql
1.
iif(:pid=0,null,:pid)



заменить на

Код: sql
1.
nullif(:pid, 0)
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309613
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIа из клиента лезет 0.
С багами приложения - к его создателю.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309621
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже до появления DISTINCT можно было делать

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
from RDB$FIELDS r1
where (r1.RDB$FIELD_SUB_TYPE = :id) and ( cast(:id as smallint) is not null )

union all

select r2.*
from RDB$FIELDS r2
where  (r2.RDB$FIELD_SUB_TYPE is null ) and ( cast(:id as smallint) is null )
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309622
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисAriochосталось ещё запилить WHERE x in (10,20, NULL, 30, 40)

с этим в сад

чем это отличается?
cейчас он раскладывается на =/OR/=/OR/= ....
будет раскладывается на not distinct/OR/not distinct/OR/not distinct ....
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309673
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI, если имеется в виду, что при ":pid is null" (т.е. значение параметра не назначено или сброшено) должны выбираться все строки, то можно так:
Код: plsql
1.
WHERE NOT(Cast(:pid AS TYPE OF COLUMN a.pid) IS NOT NULL AND a.pid != :pid)
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309737
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Ну не совсем баг (в запрос тупо подставляется число, но, наверно, можно будет поработать с этим). За nullif отдельное спасибо.
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309756
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIНу не совсем баг (в запрос тупо подставляется число

Если в запрос конкретно подставляется ноль и при этом ожидается, что выберутся записи с
NULL, то это либо баг, либо разработчику пора отрывать руки по самую задницу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309762
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вдруг это ошибка молодости?
Я так грешил в свое время. Люди до сих пор пользуются.
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309763
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Alexander A. Sak!
You wrote on 15 сентября 2016 г. 16:06:16:

Alexander A. Sak> Я так грешил в свое время.
> Люди до сих пор пользуются.Покайся, Иваныч!
Тебе скидка выйдет!

(с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309785
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIЧтобы не писать два разных запроса, кто-то предложил народу вариант:
union all еще не предлагали?
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309788
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanunion all еще не предлагали?Это слишком просто, а мы лёгких путей не ищем. :)
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309808
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

ты всё проспал :-)

19668202
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39309822
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochты всё проспал :-)

19668202
Ок, а остальные сообщения тогда о чем? :)
...
Рейтинг: 0 / 0
Использование Coalesce для учёта Null
    #39310064
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, о том, о сём...
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Использование Coalesce для учёта Null
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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