Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Порядок выполнения условий where / 16 сообщений из 16, страница 1 из 1
25.04.2016, 16:27
    #39224010
H.e.l.p
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения условий where
Добрый день!

FB 2.5 WI-V6.3.2.26540

Имеем

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE TEST (
    FIELD0  SMALLINT NOT NULL,
    FIELD1  VARCHAR(10)
);

CREATE TABLE TEST1 (
    FIELD0  SMALLINT NOT NULL
);


INSERT INTO TEST (FIELD0, FIELD1) VALUES (1, ' ');

COMMIT;



Выполняю запрос успешно
Код: sql
1.
2.
3.
4.
5.
select T.*
from TEST T
where T.FIELD1 is not null and
      T.FIELD1 similar to '[0-9]{1,}' and
      T.FIELD1 = 470415;



А вот этот дает ошибку - conversion error from string " "
Код: sql
1.
2.
3.
4.
5.
6.
select T.*
from TEST T
left join TEST1 T1 on T1.FIELD0 = T.FIELD0
where T.FIELD1 is not null and
      T.FIELD1 similar to '[0-9]{1,}' and
      T.FIELD1 = 470415;



Почему? (параметр CompleteBooleanEvaluation = 0 дефолтный в конфиге)
...
Рейтинг: 0 / 0
25.04.2016, 16:37
    #39224022
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения условий where
если не ошибаюсь, разбор идёт справа-налево
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.04.2016, 16:45
    #39224035
H.e.l.p
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения условий where
Ок.

заменил так, работает
Код: sql
1.
2.
3.
4.
5.
6.
select T.*
from TEST T
left join TEST1 T1 on T1.FIELD0 = T.FIELD0 + 0
where T.FIELD1 = 470415 and
      T.FIELD1 is not null and
      T.FIELD1 similar to '[0-9]{1,}'



Почему тогда отрабатывает первый запрос, если справа-налево?
...
Рейтинг: 0 / 0
25.04.2016, 17:51
    #39224092
H.e.l.p
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения условий where
Так что это, баг? Объясните плиз...
...
Рейтинг: 0 / 0
25.04.2016, 17:56
    #39224099
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения условий where
Hello, H E.l.p!
You wrote on 25 апреля 2016 г. 17:55:47:

H E.l.pОбъясните плиз..у тебя сперва выполняется лефт джойн, а уж потом на это всё накладываются условия фильтрации
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.04.2016, 18:03
    #39224102
H.e.l.p
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения условий where
Да ради Бога, пусть джойнится. Там условие джойна не по полю T.FIELD1. Потом фильтрация - почему в нем ошибка выходит потому что условие справа-налево? Если я сделаю для этого запроса так, то будет та же ошибка, а по идее справа-налево?...

Код: sql
1.
2.
3.
4.
5.
select *
from TEST T
where T.FIELD1 = 470415 and
      T.FIELD1 is not null and
      T.FIELD1 similar to '[0-9]{1,}'
...
Рейтинг: 0 / 0
25.04.2016, 18:24
    #39224116
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения условий where
Порядок вычисления выражений в условии WHERE в общем случае не определён. Оптимизатор
имеет право перераспределить их по своему усмотрению.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.04.2016, 20:40
    #39224217
H.e.l.p
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения условий where
Ну и как его заставить вычислять как мне нужно?
...
Рейтинг: 0 / 0
25.04.2016, 21:01
    #39224227
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения условий where
H.e.l.pНу и как его заставить вычислять как мне нужно?
Регэксп выкинь. Проверку на NULL выкинь. 470415 заключи в одинарные кавычки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.04.2016, 21:10
    #39224230
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения условий where
H.e.l.p,

а не надо полагаться на порядок вычисления в SQL. Это декларативный язык
...
Рейтинг: 0 / 0
28.04.2016, 14:38
    #39226679
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения условий where
H.e.l.p,

заверни проверку в stored procedure и вычисляй там в любом порядке как захочется

....заодно получи просмотр таблицы натуралом, потому что SP для оптимизатора будет чёрным ящиком к индексам не применимым.

и вообще - надо было снаала планы к запросам показать
...
Рейтинг: 0 / 0
29.04.2016, 05:45
    #39227178
Порядок выполнения условий where
H.e.l.pНу и как его заставить вычислять как мне нужно?
можно засунуть все проверки в один CASE, но тогда нужно будет забыть об индексах. Зато порядок вычисления предикатов будет определен однозначно...
...
Рейтинг: 0 / 0
29.04.2016, 13:25
    #39227434
H.e.l.p
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения условий where
Код: sql
1.
2.
3.
4.
5.
6.
select T.*
from TEST T
left join TEST1 T1 on T1.FIELD0 = T.FIELD0 + 0
where T.FIELD1 is not null and
      T.FIELD1 similar to '[0-9]{1,}' and
      T.FIELD1 = 470415



План
PLAN JOIN (T NATURAL, T1 NATURAL)

Чем это тебе поможет?
...
Рейтинг: 0 / 0
29.04.2016, 14:21
    #39227499
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения условий where
H.e.l.p
Код: sql
1.
T.FIELD0 + 0



тут понятно, что натурал, а я говорил пр "сначала" и "планЫ" к "запросАМ"

сравнивая планы было бы понятно почему оптимизатор посчитал разные ветви where более многообещающими в разных случаях и соответсвенно запускал в разном порядке
...
Рейтинг: 0 / 0
29.04.2016, 14:29
    #39227507
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения условий where
H.e.l.pНу и как его заставить вычислять как мне нужно?


Код: sql
1.
2.
3.
 select A, B, C
from T1, T2
where x(A) and y(B) and z(C)



===>

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
 
select * from (
select * from (
select A, B, C
from T1, T2
where x(A) )
where y(B) )
where z(C)
...
Рейтинг: 0 / 0
20.05.2016, 21:31
    #39240450
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения условий where
А если использовать Coalesce, то индекс будет использоваться?
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Порядок выполнения условий where / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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